假设我有一个数字列表,我想将这个列表分成两个子列表:一个用于奇数,另一个用于平均.
evens, odds = [], []
for e in numbers:
if e % 2 == 0:
evens.append(e)
else:
odds.append(e)
Run Code Online (Sandbox Code Playgroud)
我想知道在保持相同的复杂程度的同时,是否存在针对此问题的单线程.
我尝试使用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]
Run Code Online (Sandbox Code Playgroud)
如何在追加之前使用三元运算符:
evens, odds = [], []
for e in numbers:
(odds if e % 2 else evens).append(e)
Run Code Online (Sandbox Code Playgroud)
当然你可以在列表理解中做到这一点,但是对于它的副作用使用理解不是Pythonic,因为你创建了一个可能很大的不需要的None值列表.如果你想采用那条路线,你可以使用itertools消费食谱.