为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梦里花落0921 2021-04-03 19:11:09
上下文将整数列表拆分为它们自己的偶数和奇数列表。    even = []    odd = []    for i in my_list:        if i % 2 == 0:            even.append(i)        else:            odd.append(i)有没有一种方法可以将上面的内容变成一个不错的紧凑列表理解器?
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

并非没有副作用并且扔掉结果。您可以执行以下操作:


even = []

odd = []

for i in my_list:

    (odd if i % 2 else even).append(i)

通常,此问题称为对列表进行分区,您可以通过搜索SO找到一些解决方案,但是没有一个解决方案更干净(在Python中)。


查看完整回答
反对 回复 2021-04-05
?
动漫人物

TA贡献1815条经验 获得超10个赞

并非如此,您可以利用副作用来破解某些东西,但这不是列表理解的目的


>>> 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.append

odd_append = odd.append

for i in my_list:

    (odd_append if i%2 else even_append)(i) 

另一个提速方法是使用i&1而不是i%2选择偶数或奇数


查看完整回答
反对 回复 2021-04-05
  • 3 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信