2012-07-18 60 views
5

ekleyiniz Json verilerinden oluşturulan büyük bir python dict'ım var ve büyük olandan daha küçük bir dict yapıyorum. Büyük sözlüğün bazı öğelerinin 'detaylar' adlı bir anahtarı vardır ve bazı öğeler yoktur. Yapmak istediğim, anahtarın büyük sözlükteki her girişte mevcut olup olmadığını kontrol etmektir ve eğer değilse, 'detaylar' değeri yeni sözlükle 'detaylar' değerini ekleyiniz. Aşağıda örnek bir kod koydum sadece bir gösteri olarak. LargeDict, kodumdaki birçok anahtarla çok daha büyüktür, ancak açıklık için basit tutuyorum.Anahtarın sözlükte olup olmadığını kontrol edin. Değilse,

LargeDict = {'results': 
[{'name':'john','age':'23','datestart':'12/07/08','department':'Finance','details':'Good Employee'}, 
{'name':'barry','age':'26','datestart':'25/08/10','department':'HR','details':'Also does payroll'}, 
{'name':'sarah','age':'32','datestart':'13/05/05','department':'Sales','details':'Due for promotion'}, 
{'name':'lisa','age':'21','datestart':'02/05/12','department':'Finance'}]} 

Bu benim SmallDict için verileri alıyorum nasıl: büyük dict girişlerden birini hiçbir detaylara sahip olduğunda

SmallDict = {d['name']:{'department':d['department'],'details':d['details']} for d in LargeDict['results']} 

Ben ancak bir anahtar hatası alıyorum. DefaultDict modülünü kullanmam gerektiğini söyleyen doğru muyum yoksa daha kolay bir yol var mı?

cevap

2

Kullanım get(key, defaultVar) yöntem için d.get(k, 'Not available') kullanabilirsiniz 'details' anahtarı eksik olduğunda:

SmallDict = {d['name']:{'department':d['department'],'details':d.get('details','No details available')} for d in LargeDict['results']} 
13

collections.defaultdict'a ihtiyacınız yoktur. Sözlük nesnelerinin setdefault yöntemini kullanabilirsiniz. Diğerleri de belirtildiği gibi sözlüğe anahtarı eklemek için istemiyorsanız

d = {} 
bar = d.setdefault('foo','bar') #returns 'bar' 
print bar # bar 
print d #{'foo': 'bar'} 

, sen get yöntemi kullanabilirsiniz.

Burada genellikle kendime bakarken bulduğum bir reference.

+0

+1 ise dict.setdefault (dokümanlar)(): "anahtar sözlükte ise, değilse, onun değerini döndürmek varsayılan ve getiri değerine sahip anahtarı takın. varsayılan varsayılan. varsayılan değer Yok. " – heltonbiker

+0

Evet. Bunu kullan. defaultdict, acemi için kötü bir yaratıktır. – javadba

+1

FWIW, bence "varsayılan" harika. Temel olarak, başka bir kaynaktan aldığınız takdirde, düzenli bir 'dict' 'bir 'dırgıta' 'dönüştürmeye değdiğini düşünmüyorum. 'Defaultdict'ın 'kötülükleri',' default'factory' özniteliğini 'None' olarak ayarlayarak atlatılabilir (bu, bir kez daha düzenli bir dict gibi davranacaktır). – mgilson

4

dict kodunuzda otomatik olarak bir giriş oluşturmak istiyorsanız collections.defaultdict kullanabilirsiniz. Yapmanız değil ve sadece (ne olursa olsun ya da) "Uygun değil" isterseniz Ancak, o zaman sadece d[key] = v olarak dict atamak ve varsayılan bir değer sağlamak için varsayılan değer

İlgili konular