繁体   English   中英

使用itertools groupby查找列表中所有偶数的组

[英]Using itertools groupby to find the group of all even numbers in a list

我试图了解itertools.groupby()函数的有用性,并创建了一个相当幼稚的用例。 我有一个数字列表,想按奇数或偶数对它们进行分组。 下面是我使用itertools.groupby()代码:

for decision, group in groupby(range(2, 11), key=lambda x: x % 2 == 0): 
    ...:     print(decision, list(group))

下面是我得到的输出:

True [2]
False [3]
True [4]
False [5]
True [6]
False [7]
True [8]
False [9]
True [10]

基本上,我期望的是将所有“ True”组合在一起而将所有“ False”组合在一起的情况。

使用groupby()甚至可能吗?

groupby()组合键输出相等的连续值 ,从而为每个此类组提供一个共享的迭代器。 它不会一口气处理整个输入,而是在迭代时为您提供组。

在您的示例中,键针对每个值而变化,因此,每个组均由一个值组成; 它以2开头,并且键输出为True ,然后是3 ,并且键产生False 因为True != False ,所以这是一个新组。 下一个值4再次将键更改为True ,因此是另一个组,依此True

您想要做的事情不能通过groupby() 到排序值到整个迭代桶,只使用字典:

grouped = {}
for value in range(2, 11):
    key = value % 2 == 0
    grouped.setdefault(key, []).append(value)

您还可以使用sorted(range(2, 11), key=lambda x: x % 2 == 0)首先对输入进行sorted(range(2, 11), key=lambda x: x % 2 == 0) ,但这很浪费时间 排序是一种更复杂的算法,需要O(n log n)( 准线性 )时间,而使用字典对值进行分组则需要O(n)( 线性 )时间。 当您只有9个元素时,这可能并不重要,但是当您必须处理1000个元素时,排序将花费大约10倍的时间,对于100万个元素而言,将近20倍,等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM