2013-02-26 100 views
5

我有一个Python 2.7中的字典列表。python字典列表根据值查找重复项

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'}] 

我希望我是很清晰

非常感谢您的建议

+0

字典是否总是包含两个键'id'和'desc',或者问题更一般? – NPE 2013-02-26 14:01:38

+0

列表中的顺序被保存是重要的吗? – entropy 2013-02-26 14:05:04

+0

@NPE - 如果OP为单个条目保存字符串并为多个条目列表,则问题将变得“更一般”(并且很难看)。 – eumiro 2013-02-26 14:14:19

回答

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}] 
+0

如果我必须根据不止一个键来寻找相同的字典,该怎么办?我有同样的问题,但唯一的ID是基于5键? – Yebach 2013-07-09 07:11:23

+0

我知道这是迟到,但你可以有一个元组作为一个字典的关键。 – jangeador 2017-10-23 22:22:35

9

你可以试试:

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)] 
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] 
相关问题