2013-02-26 38 views
5

numaralı değere göre buluyorum. Python 2.7'de bir dikte listesi var.sözlüklerin python listesi çiftleri

a =[{'id': 1,'desc': 'smth'}, 
    {'id': 2,'desc': 'smthelse'}, 
    {'id': 1,'desc': 'smthelse2'}, 
    {'id': 1,'desc': 'smthelse3'},....] 
ben listeyi çukur gitmek ve bu aynı değere sahip dicts bulmak istiyoruz

- id (örneğin id = 1) ve

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

Ben yeteri kadar açıktı umut yeni bir dicti oluşturmak

onlar tek bir eleman içerse bile her yerde listeleri gibi "desc" değerleri tutmaya iyidir önerilerinizi

+0

Sözlükler her zaman iki anahtar içerir, "id" ve "desc" veya daha genel sorun mu? – NPE

+0

Listedeki siparişin korunması önemlidir? – entropy

+0

@NPE - OP, tek girişler için dizeleri ve çoklu girişler için listeler tutuyorsa sorun "daha genel" (ve çirkin) olacaktır. – eumiro

cevap

3

için çok teşekkür ederim. Eğer Bu da dizeleri çalışacak

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

yapabilirsiniz Bu şekilde, sadece ne istediğinizi olmadığı, ayrı ayrı karakterleri dönüyor.

Ve şimdi çözüm size listelerin dicts bir listesini vererek:

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 artık şudur:

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

Ya da tek bir tuşa dayalı olarak eşit diktikleri aramak zorunda kalırsam ne olur? Aynı problem var ama benzersiz kimlik 5 tuşa dayanıyor mu? – Yebach

+0

Geç olduğunu biliyorum, ama bir tüfekle bir dikte anahtarı olabilir. – jangeador

9

Deneyebilirsin: To

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()] 

siparişi koru:

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]