3 回答
TA贡献1877条经验 获得超1个赞
并非没有副作用并且扔掉结果。您可以执行以下操作:
even = []
odd = []
for i in my_list:
(odd if i % 2 else even).append(i)
通常,此问题称为对列表进行分区,您可以通过搜索SO找到一些解决方案,但是没有一个解决方案更干净(在Python中)。
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选择偶数或奇数
添加回答
举报