按标准拆分列表

时间:2017-07-28 10:16:58

标签: python list

假设我有一个数字列表,我想将此列表拆分为两个子列表:一个用于奇数,另一个用于平均。

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]

2 个答案:

答案 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]