[英]How to group list of tuples?
注意:我當然知道如何在顯式 for 循環中執行此操作,但我正在尋找一種更具可讀性的解決方案。
如果可能,我想通過使用一些內置功能來解決這個問題。 最好的情況是這樣的
result = [ *groupby logic* ]
假設有以下列表:
import numpy as np
np.random.seed(42)
N = 10
my_tuples = list(zip(np.random.choice(list('ABC'), size=N),
np.random.choice(range(100), size=N)))
my_tuples
在哪里
[('C', 74),
('A', 74),
('C', 87),
('C', 99),
('A', 23),
('A', 2),
('C', 21),
('B', 52),
('C', 1),
('C', 87)]
如何使用 itertools 中的groupby
按標簽 A、B 和 C 對索引(每個元組的索引 1 處的整數值)進行分組?
如果我做這樣的事情:
from itertools import groupby
#..
[(k,*v) for k, v in dict(groupby(my_tuples, lambda x: x[0])).items()]
我看到這會產生錯誤的結果。
想要的結果應該是
{
'A': [74, 23, 2],
# ..
}
最簡單的解決方案可能是根本不使用groupby
。
from collections import defaultdict
d = defaultdict(list)
for k, v in my_tuples:
d[k].append(v)
我不使用groupby
的原因是groupby(iterable)
iterable
中相鄰的項目分組。 因此,要將所有'C'
值放在一起,您首先必須對列表進行排序。 除非您有理由使用groupby
,否則沒有必要。
您應該將collections.defaultdict
用於 O( n ) 解決方案,請參閱@PatrickHaugh 的回答。
使用itertools.groupby
需要在分組前進行排序,導致 O( n log n ) 復雜度:
from itertools import groupby
from operator import itemgetter
sorter = sorted(my_tuples, key=itemgetter(0))
grouper = groupby(sorter, key=itemgetter(0))
res = {k: list(map(itemgetter(1), v)) for k, v in grouper}
print(res)
{'A': [74, 23, 2],
'B': [52],
'C': [74, 87, 99, 21, 1, 87]}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.