是否可以从理解内部将结果编译为唯一列表?

上下文将整数列表拆分为它们自己的偶数和奇数列表。


    even = []

    odd = []

    for i in my_list:

        if i % 2 == 0:

            even.append(i)

        else:

            odd.append(i)

有没有一种方法可以将上面的内容变成一个不错的紧凑列表理解器?


梦里花落0921
浏览 172回答 3
3回答

冉冉说

并非没有副作用并且扔掉结果。您可以执行以下操作:even = []odd = []for i in my_list:    (odd if i % 2 else even).append(i)通常,此问题称为对列表进行分区,您可以通过搜索SO找到一些解决方案,但是没有一个解决方案更干净(在Python中)。

动漫人物

并非如此,您可以利用副作用来破解某些东西,但这不是列表理解的目的>>> even = []>>> odd = []>>> [(odd if i%2 else even).append(i) for i in range(10)][None, None, None, None, None, None, None, None, None, None] # it's a waste to make this list>>> even[0, 2, 4, 6, 8]>>> odd[1, 3, 5, 7, 9]这一点浪费更少(但更难理解)>>> even = []>>> odd = [i for i in range(10) if i%2 or even.append(i)]>>> even[0, 2, 4, 6, 8]>>> odd[1, 3, 5, 7, 9]但是,您可以使用第一个列表理解中的条件来简化循环even = []odd = []for i in my_list:                     # Doesn't make a pointless list of `None`    (odd if i%2 else even).append(i) 如果my_list确实很长,则值得将append方法绑定到局部变量以节省额外的查找(对于10000的列表,可节省约30%)even = []odd = []even_append = even.appendodd_append = odd.appendfor i in my_list:    (odd_append if i%2 else even_append)(i) 另一个提速方法是使用i&1而不是i%2选择偶数或奇数
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python