Python 如果两个键值相同,如何对字典列表中的元素求和
我有以下词典列表:Python 如果两个键值相同,如何对字典列表中的元素求和,python,list,dictionary,Python,List,Dictionary,我有以下词典列表: dictionary =[{'Flow': 100, 'Location': 'USA', 'Name': 'A1'}, {'Flow': 90, 'Location': 'Europe', 'Name': 'B1'}, {'Flow': 20, 'Location': 'USA', 'Name': 'A1'}, {'Flow': 70, 'Location': 'Europe', 'Name': 'B1
dictionary =[{'Flow': 100, 'Location': 'USA', 'Name': 'A1'},
{'Flow': 90, 'Location': 'Europe', 'Name': 'B1'},
{'Flow': 20, 'Location': 'USA', 'Name': 'A1'},
{'Flow': 70, 'Location': 'Europe', 'Name': 'B1'}]
我想创建一个新的字典列表,其中包含所有字典的总和Flow
值,其中Location
和Name
是相同的。我期望的结果是:
new_dictionary =[{'Flow': 120, 'Location': 'USA', 'Name': 'A1'},
{'Flow': 160, 'Location': 'Europe', 'Name': 'B1'},]
如何实现这一点呢?这是可能的,但在python中实现却非常重要。我可以建议使用熊猫吗?使用
groupby
、sum
和to_dict
,这很简单
import pandas as pd
(pd.DataFrame(dictionary)
.groupby(['Location', 'Name'], as_index=False)
.Flow.sum()
.to_dict('r'))
[{'Flow': 160, 'Location': 'Europe', 'Name': 'B1'},
{'Flow': 120, 'Location': 'USA', 'Name': 'A1'}]
要安装,请使用pip安装--user
否则,可以使用
itertools.groupby
应用伪泛型组操作
from itertools import groupby
from operator import itemgetter
grouper = ['Location', 'Name']
key = itemgetter(*grouper)
dictionary.sort(key=key)
[{**dict(zip(grouper, k)), 'Flow': sum(map(itemgetter('Flow'), g))}
for k, g in groupby(dictionary, key=key)]
[{'Flow': 160, 'Location': 'Europe', 'Name': 'B1'},
{'Flow': 120, 'Location': 'USA', 'Name': 'A1'}]
如果可能的话,我也更喜欢使用Pandas,下面是使用普通python的解决方案:
In [1]: import itertools
In [2]: dictionary =[{'Flow': 100, 'Location': 'USA', 'Name': 'A1'},
...: {'Flow': 90, 'Location': 'Europe', 'Name': 'B1'},
...: {'Flow': 20, 'Location': 'USA', 'Name': 'A1'},
...: {'Flow': 70, 'Location': 'Europe', 'Name': 'B1'}]
...:
In [3]: import operator
In [4]: key = operator.itemgetter('Location', 'Name')
In [5]: [{'Flow': sum(x['Flow'] for x in g),
...: 'Location': k[0],
...: 'Name': k[1]}
...: for k, g in itertools.groupby(sorted(dictionary, key=key), key=key)]
...:
...:
Out[5]:
[{'Flow': 160, 'Location': 'Europe', 'Name': 'B1'},
{'Flow': 120, 'Location': 'USA', 'Name': 'A1'}]
另一种方法是使用defaultdict,它为您提供了一种稍微不同的表示(尽管您可以根据需要将其转换回Dict列表):
不完全是您期望的输出,但是 使用
collections.Counter()
将提供:
Counter({ ('Europe', 'B1'): 160,
('USA', 'A1'): 120 })
我希望这至少能给你一些想法 我想对答案下半部分不可读的一行字投反对票,但上半部分看起来很好。我该怎么办((注意:您可以将
**{'Flow':sum(map(itemgetter('Flow'),g))}
简化为'Flow':sum(map(itemgetter('Flow'),g))
)
count = Counter()
for i in dictionary:
count[i['Location'], i['Name']] += i['Flow']
print count
Counter({ ('Europe', 'B1'): 160,
('USA', 'A1'): 120 })