>>> 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)
>>> isodd=lambda x: x%2
>>> random.shuffle(my_list)
>>> even,odd=[x for x in my_list if not isodd(x)],[x for x in my_list if isodd(x)]
>>> even
[12, 6, 2, 18, 14, 0, 10, 16, 8, 4]
>>> odd
[17, 1, 19, 11, 15, 5, 9, 13, 7, 3]
不是真的,你可以用副作用破解一些东西,但这不是列表理解的目的
稍微少一点浪费(但更难理解)是这样的
但是,您可以使用第一个列表中的条件来简化循环
如果
my_list
真的很长,那么将append方法绑定到局部变量以保存额外的查找可能是值得的(为10000个列表节省约30%)另一种加速方法是使用
i&1
而不是i%2
来选择偶数或奇数如果奇数/偶数与列表索引匹配,则可以使用切片来执行此操作:
如果您只想紧凑(快速):
不使用副作用和丢弃结果。但您可以这样做:
这个问题通常称为分区列表,通过搜索可以找到some solutions,但是没有一个更干净(在Python中)。你知道吗
相关问题 更多 >
编程相关推荐