2013-02-26 47 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] 
相關問題