【发布时间】:2017-07-28 10:16:58
【问题描述】:
假设我有一个数字列表,我想将此列表拆分为两个子列表:一个用于奇数,另一个用于偶数。
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]
【问题讨论】:
-
附带说明,
O(2n)和O(n)具有相同的幅度,并且大部分时间可以被视为相等。 -
O(2n) 和 O(n) 一样,只是说...
-
@DeepSpace 是的,我知道,但它仍然慢了一倍,这让我很困扰,我宁愿尽可能高效地进行操作
-
顺便说一下,虽然我们正在这样做,但您的
groupby解决方案不是O(2n)。由于sorted使用快速排序,您的第二个解决方案的复杂性(平均)为O(nlogn + n)。 -
@DeepSpace 真的,我真的没有停下来思考正在使用什么排序算法,我的意思是它增加了第一个循环没有引入的额外复杂性