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)
你能帮我解决一下正确的代码吗?
只需计算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)
使用标准字典,解决方案也很简单。不需要Counter或OrderedDict这里:
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)