基于值的 Python 字典列表查找重复项

9

我有一个字典列表:

a =[{'id': 1,'desc': 'smth'},
    {'id': 2,'desc': 'smthelse'},
    {'id': 1,'desc': 'smthelse2'},
    {'id': 1,'desc': 'smthelse3'}]

我希望你能帮我找出列表中具有相同 id 值(例如 id=1)的字典,并创建一个新字典:

b = [{'id':1, 'desc' : [smth, smthelse2,smthelse3]}, 
     {'id': 2, 'desc': 'smthelse'}]

字典中是否总是包含"id"和"desc"这两个键,还是问题更为普遍? - NPE
列表中的顺序是否很重要? - entropy
如果OP为单个输入保留字符串,而为多个输入使用列表,则@NPE的问题将会变得“更普遍”(且丑陋)。 - eumiro
3个回答

11

你可以尝试:

import operator, itertools

key = operator.itemgetter('id')

b = [{'id': x, 'desc': [d['desc'] for d in y]} 
     for x, y in itertools.groupby(sorted(a, key=key), key=key)]

3

即使只有一个元素,最好在任何地方都将“ desc”值保持为列表。这样可以做到

for d in b:
    print d['id']
    for desc in d['desc']:
        print desc

这种方法同样适用于字符串,但它只返回单个字符,这并不是你想要的。

现在,我会给你提供一个解决方案,返回一个字典列表:

a =[{'id': 1,'desc': 'smth'},{'id': 2,'desc': 'smthelse'},{'id': 1,'desc': 'smthelse2'},{'id': 1,'desc': 'smthelse3'}]

c = {}
for d in a:
    c.setdefault(d['id'], []).append(d['desc'])
b = [{'id': k, 'desc': v} for k,v in c.iteritems()]

b 现在是:

[{'desc': ['smth', 'smthelse2', 'smthelse3'], 'id': 1},
 {'desc': ['smthelse'], 'id': 2}]

如果我需要基于不止一个键查找相等的字典怎么办?我有同样的问题,但唯一的ID是基于5个键的? - Yebach
我知道有点晚了,但你可以将元组作为字典键。 - jangeador

0
from collections import defaultdict

d = defaultdict(list)
for x in a:
    d[x['id']].append(x['desc']) # group description by id
b = [dict(id=id, desc=desc if len(desc) > 1 else desc[0])
     for id, desc in d.items()]

为了保持顺序:
b = []
for id in (x['id'] for x in a):
    desc = d[id]
    if desc:
       b.append(dict(id=id, desc=desc if len(desc) > 1 else desc[0]))
       del d[id]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接