2013-02-26 17 views
5

私はPython 2.7でdictsのリストを持っています。python辞書のリストは、値に基づいて重複を見つける

a =[{'id': 1,'desc': 'smth'}, 
    {'id': 2,'desc': 'smthelse'}, 
    {'id': 1,'desc': 'smthelse2'}, 
    {'id': 1,'desc': 'smthelse3'},....] 
私はリストの谷に行くと、同じ値を持つdicts見つけたい

- IDを(例えば、ID = 1)と

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

が、私は十分に明確だった願って新しい辞書を作成します

は彼らが唯一の単一の要素を含んでいても、どこにでもリストとして「DESC」の値を維持する方が良い

+0

辞書には常に「id」と「desc」の2つのキーが含まれていますか、それとももっと一般的な問題ですか? – NPE

+0

リスト内の順序を保持することは重要ですか? – entropy

+0

@NPE - OPが単一エントリの文字列と複数のエントリのリストを保持する場合、問題は「より一般的」(そして醜い)になります。 – eumiro

答えて

3

ご提案いただき、誠にありがとうございます。あなたができるこの方法

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

これは文字列にも機能し、個々の文字を返すだけで、あなたの望むものではありません。

そして今、あなたのリストのdictsのリストを与えるソリューション:

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

+0

私はこれが遅いことを知っていますが、あなたはdictキーとしてタプルを持つことができます。 – jangeador

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] 
関連する問題