如何对元组列表进行分组?

dis*_*ame 2 python sorting grouping dictionary python-itertools

注意:我当然知道如何在显式 for 循环中执行此操作,但我正在寻找一种更具可读性的解决方案。

如果可能,我想通过使用一些内置功能来解决这个问题。最好的情况是这样的

result = [ *groupby logic* ]
Run Code Online (Sandbox Code Playgroud)

假设有以下列表:

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)))
Run Code Online (Sandbox Code Playgroud)

这里my_tuples

[('C', 74),
 ('A', 74),
 ('C', 87),
 ('C', 99),
 ('A', 23),
 ('A', 2),
 ('C', 21),
 ('B', 52),
 ('C', 1),
 ('C', 87)]
Run Code Online (Sandbox Code Playgroud)

如何使用groupbyitertools 中的标签 A、B 和 C 对索引(每个元组的索引 1 处的整数值)进行分组?

如果我做这样的事情:

from itertools import groupby

#..

[(k,*v) for k, v in dict(groupby(my_tuples, lambda x: x[0])).items()]
Run Code Online (Sandbox Code Playgroud)

我看到这会产生错误的结果。

想要的结果应该是

{
  'A': [74, 23, 2],
  # ..
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*ugh 5

最简单的解决方案可能是根本不使用groupby

from collections import defaultdict

d = defaultdict(list)

for k, v in my_tuples:
    d[k].append(v)
Run Code Online (Sandbox Code Playgroud)

我不会使用的原因groupby是因为将相邻的groupby(iterable)项目分组iterable。因此,要将所有'C'值放在一起,您首先必须对列表进行排序。除非您有理由使用groupby,否则没有必要。