Using itertools.groupby()
你需要两个单独的迭代:
In [20]: [[i[0], j, k, sum(z)] for i, j, k, z in [zip(*g) for _, g in groupby(L, itemgetter(0))]]
Out[20]:
[['grape', ('green', 'purple'), (2, 3), 103],
['apple', ('red', 'greed', 'red'), (2, 3, 4), 29],
['banana', ('yellow',), (2,), 3]]
这是另一种使用方法collections.defaultdict
,但不是优化:
In [34]: d = defaultdict(list)
In [35]: for i, j, k, z in L:
d[i].append((j, k, z))
....:
In [36]: [[i, j, k, sum(z)] for i, j, k, z in [[i, *zip(*values)] for i, values in d.items()]]
Out[36]:
[['banana', ('yellow',), (2,), 3],
['apple', ('red', 'greed', 'red'), (2, 3, 4), 29],
['grape', ('green', 'purple'), (2, 3), 103]]
Note that *zip(...)
在列表中称为就地解包,仅在 python 3.5+ 中可用。