Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果两个键值相同,如何对字典列表中的元素求和_Python_List_Dictionary - Fatal编程技术网

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 })