[英]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.