簡體   English   中英

如果兩個鍵值相同,如何對詞典列表中的元素求和

[英]How to sum elements in list of dictionaries if two key values are the same

我有以下詞典列表:

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值,其中LocationName是相同的。 我想要的輸出是:

new_dictionary =[{'Flow': 120, 'Location': 'USA', 'Name': 'A1'},
            {'Flow': 160, 'Location': 'Europe', 'Name': 'B1'},]

我怎樣才能做到這一點?

這是可能的,但在python中實現並不重要。 我可以建議使用熊貓嗎? 這對於groupbysumto_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 install --user pandas


否則,您可以使用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,它會給你一個稍微不同的表示(盡管如你所願你可以將它轉換回dicts列表):

In [11]: import collections

In [12]: cnt = collections.defaultdict(int)

In [13]: for r in dictionary:
    ...:     cnt[(r['Location'], r['Name'])] += r['Flow']
    ...:

In [14]: cnt
Out[14]: defaultdict(int, {('Europe', 'B1'): 160, ('USA', 'A1'): 120})

In [15]: [{'Flow': x, 'Location': k[0], 'Name': k[1]} for k, x in cnt.items()]
Out[15]:
[{'Flow': 120, 'Location': 'USA', 'Name': 'A1'},
 {'Flow': 160, 'Location': 'Europe', 'Name': 'B1'}]

不完全是你期望的輸出,但..

使用collections.Counter()

count = Counter()

for i in dictionary:
    count[i['Location'], i['Name']] += i['Flow']

print count

會給:

Counter({ ('Europe', 'B1'): 160, 
          ('USA', 'A1'): 120 })

我希望這至少會給你一些想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM