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,可能重复: 我有一个字典列表如下: [{'Name': 'A', 'amt':100}, {'Name': 'B', 'amt':200}, {'Name': 'A', 'amt':300}, {'Name': 'C', 'amt':400}, {'Name': 'C', 'amt':500}, {'Name': 'A', 'amt':600}] 我想对每个名称的金额求和,并在dict列表中得到以下结果: [{'Name':'A', 'amt':1000}, {'Name':

可能重复:

我有一个字典列表如下:

[{'Name': 'A', 'amt':100},
 {'Name': 'B', 'amt':200},
 {'Name': 'A', 'amt':300},
 {'Name': 'C', 'amt':400},
 {'Name': 'C', 'amt':500},
 {'Name': 'A', 'amt':600}]
我想对每个
名称
金额
求和,并在dict列表中得到以下结果:

 [{'Name':'A', 'amt':1000},
  {'Name':'B', 'amt':200},
  {'Name':'C', 'amt':900}]
将给你一本字典,其中键是名称,金额是值。如果您必须将其作为目录列表:

[{'Name':key, 'amt':value} for key, value in output_dict.items()]

您可以这样做:

def sum(dict_list):
    result_list = []
    name_dict = {}
    for dict_item in dict_list:
        name = dict_item['Name']
        amt = dict_item['amt']
        if name_dict.has_key(name):
            pos = name_dict[name]
            result_list[pos] = {'Name':name, 'amt': (result_list[pos]['amt']+amt)}
        else:
            result_list.append(dict_item)
            name_dict[name] = len(result_list) - 1
    return result_list
它产生
c

{'A': 1000, 'C': 900, 'B': 200}
要将其转换为词典列表,请执行以下操作:

[{'Name': name, 'amt': amt} for name, amt in c.items()]
结果:

[{'Name': 'A', 'amt': 1000}, {'Name': 'C', 'amt': 900}, {'Name': 'B', 'amt':200}]
示例解 我不确定它是否“足够漂亮/通灵”,但它肯定很短,并且在没有额外模块的情况下也能正常工作

def get_amt(name):
    return lambda x: x['amt'] if x['Name']==name else 0

names = sorted(set(map(lambda x: x['Name'], data)))
result = [{'Name':name,'amt':sum(map(get_amt(name), data))} for name in names]
证明 证据如下:

如果您像问题中那样提供
数据
,则
结果将等于:

[{'Name':'A','amt':1000},{'Name':'B','amt':200},{'Name':'C','amt':900}]


这是另一个可能的解决方案,这次使用itertools:

lst = [
{'Name': 'A', 'amt':100},
{'Name': 'B', 'amt':200},
{'Name': 'A', 'amt':300},
{'Name': 'C', 'amt':400},
{'Name': 'C', 'amt':500},
{'Name': 'A', 'amt':600}]

import itertools as it
keyfunc = lambda x: x['Name']

groups = it.groupby(sorted(lst, key=keyfunc), keyfunc)
[{'Name':k, 'amt':sum(x['amt'] for x in g)} for k, g in groups]

你做过什么事吗?或者这是“生成我的代码”问题的另一种情况?如果是重复的问题,如果您提供了重复问题的链接而不是将其标记为重复的问题,那将是非常好的。这对我来说几乎是一样的。谢谢,我认为这个答案应该是公认的答案。正如Martjin Pieters曾经对我说的那样,使用
排序的
itertools。groupby
允许一行,但由于额外的
排序
def get_amt(name):
    return lambda x: x['amt'] if x['Name']==name else 0

names = sorted(set(map(lambda x: x['Name'], data)))
result = [{'Name':name,'amt':sum(map(get_amt(name), data))} for name in names]
lst = [
{'Name': 'A', 'amt':100},
{'Name': 'B', 'amt':200},
{'Name': 'A', 'amt':300},
{'Name': 'C', 'amt':400},
{'Name': 'C', 'amt':500},
{'Name': 'A', 'amt':600}]

import itertools as it
keyfunc = lambda x: x['Name']

groups = it.groupby(sorted(lst, key=keyfunc), keyfunc)
[{'Name':k, 'amt':sum(x['amt'] for x in g)} for k, g in groups]