您可以使用相同的原理,方法是将前三个元素用作键,并将
int用作默认值工厂
defaultdict(这样您将获得
0初始值):
from collections import defaultdicta_list = [['apple', 50, 60, 7], ['orange', 70, 50, 8], ['apple', 50, 60, 12]]d = defaultdict(int)for sub_list in a_list: key = tuple(sub_list[:3]) d[key] += sub_list[-1]new_data = [list(k) + [v] for k, v in d.iteritems()]
如果您使用的是Python 3,则可以简化为:
d = defaultdict(int)for *key, v in a_list: d[tuple(key)] += vnew_data = [list(k) + [v] for k, v in d.items()]
因为您可以使用加星标的目标从列表中获取所有“剩余”值,所以每个子列表主要分配给
key,最后一个值分配给
v,从而使循环变得更简单了(并且
.iteritems()dict中没有方法Python
3,因为
.items()已经是一个迭代器)。
所以,我们使用一个
defaultdict使用
0作为默认值,然后从第3个值产生的每个键(作为一个元组,所以你可以使用它作为一个字典的键)总结的最后一个值。
因此,对于第一个项目,
['apple', 50, 60, 7]
我们创建一个key('apple', 50, 60)
,在d
其中查找键(该键不存在,但是defaultdict
将int()
用于创建新值0
),然后7
从该第一项中添加。对
('orange', 70, 50)
键和值执行相同的 *** 作8
。对于第3个项目,我们
('apple', 50, 60)
再次获取密钥,并将其添加12
到中已存在的密钥7
中d[('apple', 50, 60)]
。共19个
然后,我们将(键,值)对重新放入列表中,您就完成了。结果是:
>>> new_data[['apple', 50, 60, 19], ['orange', 70, 50, 8]]
需要对数据进行排序的另一种实现方式是
itertools.groupby:
from itertools import groupbyfrom operator import itemgettera_list = [['apple', 50, 60, 7], ['orange', 70, 50, 8], ['apple', 50, 60, 12]]newlist = [list(key) + [sum(i[-1] for i in sublists)] for key, sublists in groupby(sorted(a_list), key=itemgetter(0, 1, 2))]
对于相同的输出。如果您的数据未排序,这会变慢,但是很高兴知道不同的方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)