【问题标题】:Adding values of the same key in different dictionaries in a list在列表的不同字典中添加相同键的值
【发布时间】:2021-08-21 14:02:58
【问题描述】:

我有一个字典列表:

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

有人可以推荐任何 Pythonic 的方法吗?

非常感谢!

【问题讨论】:

  • 你能证明自己任何努力解决这个问题吗?
  • 欢迎您!请先考虑这个article
  • @Ignas 请使用您在 cmets 中发布的代码并将其作为您问题的一部分。

标签: python list dictionary for-loop


【解决方案1】:

您愿意使用数据框来完成此任务吗?

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')

【讨论】:

  • 谢谢!您的意见让我对字典有了更好的理解。
  • @BlackRaven my_list_2 = df.groupby('Name' , as_index=False).sum().to_dict('records') 你可以在你的答案中添加这个。
  • 是的,我每天都在学习新东西。谢谢@Nk03!
【解决方案2】:

你可以使用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'])]

OUTPUT:

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

【讨论】:

  • 非常感谢!它工作得很好。我仍然是 6 个月的初学者。我有时会陷入这样的情况。再次感谢!
【解决方案3】:

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

my_list_2 = {}
for entry in my_list:
    name = entry["Name"]
    amount = entry["Amount"]
    my_list_2.setdefault(name, 0)
    my_list_2[name] += amount

这将逐个迭代您的原始列表条目,并检查名称是否已知。如果不是,则将其总和设置为 0。最后,将当前条目的数量添加到当前总和中。最后,你会得到一个如下所示的 dict:

{'John Doe': 350, 'Peter Doe': 50, 'Lisa Doe': 90}

如果您真的想要恢复旧结构,可以使用一些列表理解魔法重新转换它:

my_list_3 = [{"Name": name, "Amount": amount} for name, amount in my_list_2.items()]

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

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2019-12-26
  • 2015-08-25
  • 2018-01-20
相关资源
最近更新 更多