【发布时间】:2018-05-31 12:30:54
【问题描述】:
注意:我当然知道如何在显式 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],
# ..
}
【问题讨论】:
-
在下面你说你想要一个单行,但在这里你说你想要更多可读性。更少的行数并不一定意味着可读性更高,事实上,如果你尝试做太多事情,通常意味着可读性会大大降低。
-
作为提供
itertools答案的人,我完全同意@glibdud。可读性通常并不意味着单行化。collections.defaultdict的复杂度也较低。 -
@glibdud 好吧,我完全同意这里。但我保证我离开了我尝试编写“酷代码”的阶段:D
标签: python sorting dictionary grouping itertools