【问题标题】:Python list of dictionaries - adding the dicts with same key names [duplicate]Python 字典列表 - 添加具有相同键名的字典 [重复]
【发布时间】:2018-09-28 11:06:24
【问题描述】:

我有一个这样的 python 列表:

user = [
        {'name': 'ozzy', 'quantity': 5},
        {'name': 'frank', 'quantity': 4},
        {'name': 'ozzy', 'quantity': 3},
        {'name': 'frank', 'quantity': 2},
        {'name': 'james', 'quantity': 7},
        ]

我正在尝试编写代码以通过添加数量来加入具有相同名称的字典。最终名单将是:

user = [
        {'name': 'ozzy', 'quantity': 8},
        {'name': 'frank', 'quantity': 6},
        {'name': 'james', 'quantity': 7}
        ]

我已经尝试了一些方法,但我很难获得正确的代码。我在下面写的代码有点添加值(其实我的列表要长得多,我只是添加了一小部分供参考)。

newList = []
    quan = 0
    for i in range(0,len(user)):      
        originator = user[i]['name']
        for j in range(i+1,len(user)):
            if originator == user[j]['name']:
                quan = user[i]['quantity'] + user[j]['quantity']
                newList.append({'name': originator, 'Quantity': quan})

您能帮我获取正确的代码吗?

【问题讨论】:

  • 你写的代码有什么问题?输出不正确吗?请给出您当前和预期的输出。
  • 是否应该保持输出的相对顺序?
  • @Zinki 他们给出了预期的输出

标签: python list dictionary iteration


【解决方案1】:

只需计算 collections.Counter 中的项目,并在需要时扩展回字典列表:

user = [
        {'name': 'ozzy', 'quantity': 5},
        {'name': 'frank', 'quantity': 4},
        {'name': 'ozzy', 'quantity': 3},
        {'name': 'frank', 'quantity': 2},
        {'name': 'james', 'quantity': 7},
        ]

import collections

d = collections.Counter()
for u in user:
    d[u['name']] += u['quantity']

print(dict(d))

newlist = [{'name' : k, 'quantity' : v} for k,v in d.items()]

print(newlist)

先输出Counter dict,已经足够了:

{'frank': 6, 'ozzy': 8, 'james': 7}

以及使用字典列表重新格式化的输出:

[{'name': 'frank', 'quantity': 6}, {'name': 'ozzy', 'quantity': 8}, {'name': 'james', 'quantity': 7}]

【讨论】:

    【解决方案2】:

    使用标准字典也很简单。这里不需要CounterOrderedDict

    user = [
            {'name': 'ozzy', 'quantity': 5},
            {'name': 'frank', 'quantity': 4},
            {'name': 'ozzy', 'quantity': 3},
            {'name': 'frank', 'quantity': 2},
            {'name': 'james', 'quantity': 7},
            ]
    
    dic = {}
    for item in user:
      n, q = item.values()
      dic[n] = dic.get(n,0) + q
    print(dic)
    
    user = [{'name':n, 'quantity':q} for n,q in dic.items()]
    print(user)
    

    结果:

    {'ozzy': 8, 'frank': 6, 'james': 7}
    [{'name': 'ozzy', 'quantity': 8}, {'name': 'frank', 'quantity': 6}, {'name': 'james', 'quantity': 7}]
    

    【讨论】:

    • 谢谢,这很好用,但是当我有一个像 'name surname' 这样的空白键时,我不能在 dict() 中使用它,而是 {'name surname' : k, 'quantity ' : v} 修复了该部分。
    • 好点!由于您的示例没有显示这种情况,因此我跳过了它。我已经编辑了答案...
    【解决方案3】:

    我建议更改输出字典的外观,使其真正可用。考虑这样的事情

    user = [
            {'name': 'ozzy', 'quantity': 5},
            {'name': 'frank', 'quantity': 4},
            {'name': 'ozzy', 'quantity': 3},
            {'name': 'frank', 'quantity': 2},
            {'name': 'james', 'quantity': 7},
            ]
    
    data = {}
    for i in user:
        print(i)
        if i['name'] in data:
            data[i['name']] += i['quantity']
        else:
            data.update({i['name']: i['quantity']})
    
    print(data)
    

    {'frank': 6, 'james': 7, 'ozzy': 8}

    【讨论】:

    • 使用.get() - data[i['name']] = data.get(i['name'], 0) + i['quantity'] 可以将 for 循环中的所有内容压缩为一行 - 但这仍然不能提供 OP 所需的输出
    【解决方案4】:

    如果需要保持原来的相对顺序:

    from collections import OrderedDict
    
    user = [
            {'name': 'ozzy', 'quantity': 5},
            {'name': 'frank', 'quantity': 4},
            {'name': 'ozzy', 'quantity': 3},
            {'name': 'frank', 'quantity': 2},
            {'name': 'james', 'quantity': 7},
            ]
    
    d = OrderedDict()
    for item in user:
        d[item['name']] = d.get(item['name'], 0) + item['quantity']
    
    newlist = [{'name' : k, 'quantity' : v} for k, v in d.items()]
    print(newlist)
    

    输出:

    [{'name': 'ozzy', 'quantity': 8}, {'name': 'frank', 'quantity': 6}, {'name': 'james', 'quantity': 7}]
    

    【讨论】:

      【解决方案5】:
      user = [
          {'name': 'ozzy', 'quantity': 8},
          {'name': 'frank', 'quantity': 6},
          {'name': 'james', 'quantity': 7}
      ]
      
      reference_dict = {}
      
      for item in user :
          reference_dict[item['name']] = reference_dict.get(item['name'],0) + item['quantity']
      
      #Creating new list from reference dict
      updated_user = [{'name' : k , 'quantity' : v} for k,v in reference_dict.items()]
      
      print updated_user
      

      【讨论】:

        猜你喜欢
        • 2021-12-07
        • 2019-10-04
        • 2019-11-04
        • 2015-08-19
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        相关资源
        最近更新 更多