Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按标准拆分列表_Python_List - Fatal编程技术网

Python 按标准拆分列表

Python 按标准拆分列表,python,list,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): 您可以滥

假设我有一个数字列表,我想把这个列表分成两个子列表:一个用于奇数,另一个用于偶数

evens, odds = [], []
for e in numbers:
    if e % 2 == 0:
        evens.append(e)
    else:
        odds.append(e)
我想知道在保持相同的复杂度顺序的情况下,这个问题是否有一条直线

我尝试使用
itertools.groupby
,但需要先对列表进行排序,这样我就可以实现
O(2n)
而不是
O(n)

您可以滥用列表理解,但请不要在生产代码中这样做

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]

在追加之前使用三元运算符如何:

evens, odds = [], []
for e in numbers:
    (odds if e % 2 else evens).append(e)

当然,您可以在列表理解中执行此操作,但使用理解来处理其副作用并不是一个好办法,因为您创建了一个潜在的大量不需要的
None
值列表。如果你想走那条路线,你可以改为使用。

作为旁注,
O(2n)
O(n)
具有相同的大小,大多数时间可以被视为相等。O(2n)与O(n)相同,只是说…@DeepSpace是的,我知道,但速度仍然是O(n)的两倍,这让我很困扰,我宁愿尽可能高效地完成它。顺便说一句,在我们进行这项工作时,您的
groupby
解决方案不是
O(2n)
。由于
sorted
正在使用快速排序,您的第二个解决方案的复杂性(平均)是
O(nlogn+n)
@DeepSpace true,因此我确实没有停下来思考正在使用的排序算法,我的观点是,它增加了额外的复杂性,第一个循环没有引入哦,不,我不想像那样利用列表理解,这是一种使用列表理解的糟糕方式,这真的不是理解列表的目的…@ettanany,我用“滥用”和“不要那样做”这两个词指出@Darkaird请看上面的不是最容易阅读的,但我认为这个答案最适合,因为它是O(n)。你能详细说明一下如何使用
消费
这个问题吗?@dabadaba就像
消费((如果e%2的几率相等)。在数字中为e添加(e)
@dabadaba事实上,在你的案例中,你可以使用
collections.deque(((如果e%2相等,则几率为0)。在数字中为e添加(e),maxlen=0)
这太好了!我会尽量记住那个食谱。。。
evens, odds = [], []
for e in numbers:
    (odds if e % 2 else evens).append(e)