簡體   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