我已经尝试了其他解决方案,但仍然没有运气,我的问题是我有一个字典列表,我必须检查密钥中是否有任何重复值(人名):
样品清单:
[{"id": 1,"name": "jack","count": 7},{"id": 12,"name": "jack","count": 5}]
如果名称重复,则应在键计数中添加值,结果应为:
[{"id": 1,"name": "jack","count": 12}]
编辑:ID没关系,我需要至少一个id出现。
一个详细的解决方案可能是:
new = {}
for d in data:
name = d["name"]
if name in new:
new[name]["count"] += d["count"]
else:
new[name] = dict(d)
result = list(new.values())
注意:这可以通过使用list comprehension和方法get来简化,但我认为这个更具可读性。
由于id
字段不是那么重要,我将创建一个dict
,其密钥为name
,value为列表中的项值
from collections import defaultdict
a = [{"id": 1,"name": "jack","count": 7},{"id": 12,"name": "jack","count": 5}]
d = defaultdict(list)
迭代列表并映射键和值
for idx,i in enumerate(a):
d[i['name']].append(i) #key is 'name'
在这一点上,d
将会是这样的
{'jack':[{'count':7,'id':1,'name':'jack'},{'count':5,'id':12,'name':'jack'}] }
现在,如果列表的长度是>1
意味着我们必须迭代list
并进行求和并更新计数
for k,v in d.items():
if len(v) > 1:
temp = v[0]
for t in v[1:]:
temp['count'] = temp['count']+t['count'] #update the count
d[k] = temp
print(list(d.values())) #[{'count': 12, 'id': 1, 'name': 'jack'}]
为了处理count
缺失的情况
[{"id": 1,"name": "jack"},{"id": 12,"name": "jack","count": 5}]
用以上代替上面的计数更新逻辑
temp['count']=temp.get('count',0)+t.get('count',0)