簡體   English   中英

如何對元組列表進行分組?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM