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)
最简单的解决方案可能是根本不使用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,否则没有必要。