Python2 按值合并列表列表

2024-03-04

我有一个包含 4 个元素的列表,它看起来像:

L = [['grape','green',2, 100], ['grape','purple',3,3], ['apple','red',2, 15], ['apple','greed',3, 10],
     ['apple','red',4, 4], ['banana','yellow',2, 3]]

我想要一个函数来按第一个元素合并该列表,连接第二个和第三个元素,然后对最后一个元素求和以获得如下输出:

[['grape',['green,purple'],[2,3],103],['banana','yellow',2, 3],['apple',['red','green','red'],[2,3,4],29]

我尝试了以下代码:

[(x,sum(map(itemgetter(3),y))) for x,y in itertools.groupby(L, itemgetter(0))], which can successfully sum up the last element, but

[(x,(map(itemgetter(1),y)),(map(itemgetter(2),y)),sum(map(itemgetter(3),y))) for x,y in itertools.groupby(L, itemgetter(0))]

没有按我的预期工作。

有什么办法可以做到这一点吗?


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+ 中可用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python2 按值合并列表列表 的相关文章

随机推荐