[英]How to sum dictionaries values with same key inside a list?
我有這個清單:
list1 = [
{'currency': 'USD', 'value': 10},
{'currency': 'USD', 'value': 12},
{'currency': 'EUR', 'value': 11},
{'currency': 'EUR', 'value': 15},
{'currency': 'EUR', 'value': 17},
{'currency': 'GBP', 'value': 13},
]
如何組合字典,以便從list1獲取此列表?
list2 = [
{'currency': 'USD', 'value': 22},
{'currency': 'EUR', 'value': 43},
{'currency': 'GBP', 'value': 13},
]
使用字典:
d = {}
for x in list1:
c, v = x["currency"], x["value"]
d[c] = d.get(c, 0) + v
# {'EUR': 43, 'GBP': 13, 'USD': 22}
然后直接使用該dict(我建議)或將其轉回你的list-of-dicts格式,使用list-comprehension:
>>> [{"currency": k, "value": v} for k, v in d.items()]
[{'currency': 'USD', 'value': 22},
{'currency': 'EUR', 'value': 43},
{'currency': 'GBP', 'value': 13}]
使用collections.defaultdict
。
演示:
import collections
d = collections.defaultdict(int)
list1 = [
{'currency': 'USD', 'value': 10},
{'currency': 'USD', 'value': 12},
{'currency': 'EUR', 'value': 11},
{'currency': 'EUR', 'value': 15},
{'currency': 'EUR', 'value': 17},
{'currency': 'GBP', 'value': 13},
]
for i in list1:
d[i['currency']] += i["value"]
print( [{'currency': k, 'value': v} for k,v in d.items()] )
輸出:
[{'currency': 'USD', 'value': 22}, {'currency': 'GBP', 'value': 13}, {'currency': 'EUR', 'value': 43}]
你可以用Counter
來計算總和
from collections import Counter
c = Counter()
for d in list1:
cur, v = d.get('currency'), d.get('value')
c.update({cur: v})
print(c)
Counter({'EUR': 43, 'USD': 22, 'GBP': 13})
並在生成輸出后:
list2 = [{'currency': cur, 'value': v} for cur, v in c.items()]
print(list2)
[{'currency': 'USD', 'value': 22}, {'currency': 'GBP', 'value': 13}, {'currency': 'EUR', 'value': 43}]
這應該這樣做:
list1 = [
{'currency': 'USD', 'value': 10},
{'currency': 'USD', 'value': 12},
{'currency': 'EUR', 'value': 11},
{'currency': 'EUR', 'value': 15},
{'currency': 'EUR', 'value': 17},
{'currency': 'GBP', 'value': 13},
]
valuePairs = {}
for d in list1:
curr = d['currency']
val = d['value']
if curr in valuePairs:
valuePairs[curr] += val
else:
valuePairs[curr] = val
solution = [{'currency': k, 'value': v} for k, v in valuePairs.items()]
你也可以這樣做:
import itertools as it
list1 = [
{'currency': 'USD', 'value': 10},
{'currency': 'USD', 'value': 12},
{'currency': 'EUR', 'value': 11},
{'currency': 'EUR', 'value': 15},
{'currency': 'EUR', 'value': 17},
{'currency': 'GBP', 'value': 13},
]
kfunc = lambda x: x['currency']
groups = it.groupby(sorted(list1, key=kfunc), kfunc)
result = [{'currency':k, 'value':sum(x['value'] for x in g)} for k, g in groups]
print(result)
你也可以單行:
[{"currency": k, "value": sum([d["value"] for d in list1 if d["currency"] == k])} for k in list(set([d["currency"] for d in list1]))]
list(set([d["currency"] for d in list1]))
為您提供唯一的貨幣列表
然后將每個唯一貨幣的值相加,以生成新的dict。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.