Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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 - Fatal编程技术网

Python 如何在列表中使用相同的键对字典值求和?

Python 如何在列表中使用相同的键对字典值求和?,python,Python,我有以下清单: 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 = [
    {'currency': 'USD', 'value': 10},
    {'currency': 'USD', 'value': 12},
    {'currency': 'EUR', 'value': 11},
    {'currency': 'EUR', 'value': 15},
    {'currency': 'EUR', 'value': 17},
    {'currency': 'GBP', 'value': 13},
]
如何组合字典,以便从列表1中获得此列表

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(我建议这样做),要么将其转换回dict列表格式,使用列表理解:

>>> [{"currency": k, "value": v} for k, v in d.items()]
[{'currency': 'USD', 'value': 22},
 {'currency': 'EUR', 'value': 43},
 {'currency': 'GBP', 'value': 13}]
这应该做到:

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()]

使用
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}]
输出:

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

您可以使用
计数器
计算总和

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}]
你也可以这样做:

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”]表示列表1中的d])
提供唯一的货币列表


然后将每个唯一货币的值相加,生成新的dict。

为什么要列出dict?如何
{“USD”:22,“EUR”:43,…}
?list2是api调用的响应,它必须是这种形式。就我个人而言,我认为这是一种单行程序不能使它更简单的情况。此外,这是O(n²),这可能是一个问题,因为列表(相当)大。