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)