如果词典列表中有重复记录,如何添加值?

问题描述 投票:0回答:2

我已经尝试了其他解决方案,但仍然没有运气,我的问题是我有一个字典列表,我必须检查密钥中是否有任何重复值(人名):

样品清单:

[{"id": 1,"name": "jack","count": 7},{"id": 12,"name": "jack","count": 5}]

如果名称重复,则应在键计数中添加值,结果应为:

[{"id": 1,"name": "jack","count": 12}]

编辑:ID没关系,我需要至少一个id出现。

python python-3.x
2个回答
1
投票

一个详细的解决方案可能是:

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来简化,但我认为这个更具可读性。


0
投票

由于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)

© www.soinside.com 2019 - 2024. All rights reserved.