Python 在列表中的不同词典中添加相同键的值

Python 在列表中的不同词典中添加相同键的值,python,list,dictionary,for-loop,Python,List,Dictionary,For Loop,我有一份字典清单: my_list = [ {"Name": "John Doe", "Amount": 150}, {"Name": "Peter Doe", "Amount": 40}, {"Name": "Peter Doe", "Amount": 10}, {"Name": "Li

我有一份字典清单:

my_list = [
{"Name": "John Doe", "Amount": 150},
{"Name": "Peter Doe", "Amount": 40},
{"Name": "Peter Doe", "Amount": 10},
{"Name": "Lisa Doe", "Amount": 90},
{"Name": "John Doe", "Amount": 200},]
我想遍历字典列表,找到键“Name”的相同值。如果值相同,我想添加“Amounts”并将其保存到新字典中。例如,上面的列表应为:

my_list_2 = [
{"Name": "John Doe", "Amount": 350},
{"Name": "Peter Doe", "Amount": 50},
{"Name": "Lisa Doe", "Amount": 90},]
有谁能提出一些类似蟒蛇的方法吗


非常感谢

您是否愿意使用dataframe来完成此任务

my_list = [
{"Name": "John Doe", "Amount": 150},
{"Name": "Peter Doe", "Amount": 40},
{"Name": "Peter Doe", "Amount": 10},
{"Name": "Lisa Doe", "Amount": 90},
{"Name": "John Doe", "Amount": 200}]
df = pd.DataFrame(my_list)
display(df.groupby('Name').sum())
输出

            Amount
    Name    
John Doe    350
Lisa Doe    90
Peter Doe   50
或者你可以做一些字典操作:

new_dict = {}
for e in my_list:
    if e['Name'] not in new_dict.keys():
        new_dict[e['Name']] = e['Amount']
    else:
        new_dict[e['Name']] += e['Amount']

my_list_2 = []
for k,v in new_dict.items():
    my_list_2.append({'Name': k, 'Amount': v})
my_list_2
输出
my_list_2

[{'Name': 'John Doe', 'Amount': 350},
 {'Name': 'Peter Doe', 'Amount': 50},
 {'Name': 'Lisa Doe', 'Amount': 90}]
编辑:谢谢@Nk03,以获得相同的输出

my_list_2 = df.groupby('Name' , as_index=False).sum().to_dict('records')

您是否愿意使用dataframe来实现这一点

my_list = [
{"Name": "John Doe", "Amount": 150},
{"Name": "Peter Doe", "Amount": 40},
{"Name": "Peter Doe", "Amount": 10},
{"Name": "Lisa Doe", "Amount": 90},
{"Name": "John Doe", "Amount": 200}]
df = pd.DataFrame(my_list)
display(df.groupby('Name').sum())
输出

            Amount
    Name    
John Doe    350
Lisa Doe    90
Peter Doe   50
或者你可以做一些字典操作:

new_dict = {}
for e in my_list:
    if e['Name'] not in new_dict.keys():
        new_dict[e['Name']] = e['Amount']
    else:
        new_dict[e['Name']] += e['Amount']

my_list_2 = []
for k,v in new_dict.items():
    my_list_2.append({'Name': k, 'Amount': v})
my_list_2
输出
my_list_2

[{'Name': 'John Doe', 'Amount': 350},
 {'Name': 'Peter Doe', 'Amount': 50},
 {'Name': 'Lisa Doe', 'Amount': 90}]
编辑:谢谢@Nk03,以获得相同的输出

my_list_2 = df.groupby('Name' , as_index=False).sum().to_dict('records')

您可以使用itertools
groupby

from itertools import groupby
my_list_2 = [{'Name': g, 'Amount': sum(i['Amount'] for i in k)} for g, k in groupby(
    sorted(my_list, key=lambda x: x['Name']), key=lambda x: x['Name'])]
输出

[{'Name': 'John Doe', 'Amount': 350},
 {'Name': 'Lisa Doe', 'Amount': 90},
 {'Name': 'Peter Doe', 'Amount': 50}]

您可以使用itertools
groupby

from itertools import groupby
my_list_2 = [{'Name': g, 'Amount': sum(i['Amount'] for i in k)} for g, k in groupby(
    sorted(my_list, key=lambda x: x['Name']), key=lambda x: x['Name'])]
输出

[{'Name': 'John Doe', 'Amount': 350},
 {'Name': 'Lisa Doe', 'Amount': 90},
 {'Name': 'Peter Doe', 'Amount': 50}]

由于您只需要每个名称的总和,因此我建议对
my_list_2
使用稍微不同的数据结构:

my_list_2={}
对于my_列表中的条目:
名称=条目[“名称”]
金额=分录[“金额”]
my_list_2.setdefault(名称,0)
我的清单2[姓名]+=金额
这将逐条迭代原始列表条目,并检查名称是否已知。如果不是,则将其总和设置为0。最后,将当前分录的金额添加到当前总和中。最后,您会得到一个如下的dict:

{'John Doe':350,'Peter Doe':50,'Lisa Doe':90}
如果您真的想要恢复旧结构,可以使用一些列表理解魔术对其进行重新转换:

my_list_3=[{“Name”:Name,“Amount”:Amount}表示Name,Amount在my_list_2.items()中

但是,如果您的DICT中附加了其他数据,您可能需要稍后从原始列表中重新获取这些数据。

因为您只需要每个名称的总和,我建议对
我的列表\u 2
使用稍微不同的数据结构:

my_list_2={}
对于my_列表中的条目:
名称=条目[“名称”]
金额=分录[“金额”]
my_list_2.setdefault(名称,0)
我的清单2[姓名]+=金额
这将逐条迭代原始列表条目,并检查名称是否已知。如果不是,则将其总和设置为0。最后,将当前分录的金额添加到当前总和中。最后,您会得到一个如下的dict:

{'John Doe':350,'Peter Doe':50,'Lisa Doe':90}
如果您真的想要恢复旧结构,可以使用一些列表理解魔术对其进行重新转换:

my_list_3=[{“Name”:Name,“Amount”:Amount}表示Name,Amount在my_list_2.items()中

但是,如果您的DICT中附加了其他数据,您可能需要稍后从原始列表中重新获取这些数据。

您能否演示自己在解决此问题方面所做的任何努力?欢迎!请先考虑这一点。@ IGANS请把你在评论中张贴的代码作为问题的一部分。你能证明自己解决这个问题的努力吗?欢迎!请先考虑这一点。@ IGNAS请把你在评论中张贴的代码作为问题的一部分,非常感谢。它工作得很好。我还是6个月的初学者。我有时会被这样的情况困住。再次感谢!非常感谢你!它工作得很好。我还是个初学6个月的人。我有时会被这样的情况困住。再次感谢!非常感谢。你的意见让我对字典有了更好的理解。是的,谢谢你的投票@BlackRaven my_list_2=
df.groupby('Name',as_index=False).sum()。到dict('records')
你可以在你的答案中添加这一点。是的,我每天都在学习新东西。。谢谢@Nk03!非常感谢。你的意见让我对字典有了更好的理解。是的,谢谢你的投票@BlackRaven my_list_2=
df.groupby('Name',as_index=False).sum()。到dict('records')
你可以在你的答案中添加这一点。是的,我每天都在学习新东西。。谢谢@Nk03!非常感谢你!非常感谢你!