假设我有一个数字列表,我想将此列表拆分为两个子列表:一个用于奇数,另一个用于平均。
evens, odds = [], []
for e in numbers:
if e % 2 == 0:
evens.append(e)
else:
odds.append(e)
我想知道在保持相同的复杂程度的同时,是否存在针对此问题的单行问题。
我尝试使用itertools.groupby
,但是需要先排序列表才能获得O(2n)
而不是O(n)
:
def is_even(n):
return n % 2 == 0
lst = sorted(lst, key=is_even)
grouper = itertools.groupby(lst, key=is_even)
lst1, lst2 = [list(v) for k, v in grouper]
答案 0 :(得分:6)
如果在追加之前使用三元运算符:
evens, odds = [], []
for e in numbers:
(odds if e % 2 else evens).append(e)
当然你可以在列表理解中做到这一点,但是对于它的副作用并不是Pythonic,因为你创建了一个可能很大的不需要的None
值列表。如果你想采取这条路线,你可以使用itertools consume recipe。
答案 1 :(得分:3)
您可以滥用列表理解,但不要在生产代码中执行此操作。
nums = range(6)
odds = []
evens = []
[odds.append(num) if num % 2 == 1 else evens.append(num) for num in nums]
print(odds, evens)
# [1, 3, 5] [2, 4]