Python字典列表 - 添加具有相同键名的dicts

Rik*_*kas 5 python iteration dictionary list

我有一个像这样的python列表:

user = [
        {'name': 'ozzy', 'quantity': 5},
        {'name': 'frank', 'quantity': 4},
        {'name': 'ozzy', 'quantity': 3},
        {'name': 'frank', 'quantity': 2},
        {'name': 'james', 'quantity': 7},
        ]
Run Code Online (Sandbox Code Playgroud)

我试图通过添加数量来编写代码以加入具有相同名称的词典.最终的清单是:

user = [
        {'name': 'ozzy', 'quantity': 8},
        {'name': 'frank', 'quantity': 6},
        {'name': 'james', 'quantity': 7}
        ]
Run Code Online (Sandbox Code Playgroud)

我尝试了一些东西,但我正在努力获得正确的代码.我在下面写的代码有点添加值(实际上我的列表更长,我刚刚添加了一小部分供参考).

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})
Run Code Online (Sandbox Code Playgroud)

你能帮我解决一下正确的代码吗?

Jea*_*bre 5

只需计算a中的项目collections.Counter,然后根据需要扩展回dicts列表:

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)
Run Code Online (Sandbox Code Playgroud)

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

{'frank': 6, 'ozzy': 8, 'james': 7}
Run Code Online (Sandbox Code Playgroud)

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

[{'name': 'frank', 'quantity': 6}, {'name': 'ozzy', 'quantity': 8}, {'name': 'james', 'quantity': 7}]
Run Code Online (Sandbox Code Playgroud)


sci*_*ics 1

使用标准字典,解决方案也很简单。不需要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)
Run Code Online (Sandbox Code Playgroud)

结果:

{'ozzy': 8, 'frank': 6, 'james': 7}
[{'name': 'ozzy', 'quantity': 8}, {'name': 'frank', 'quantity': 6}, {'name': 'james', 'quantity': 7}]
Run Code Online (Sandbox Code Playgroud)