2016-04-12 35 views
1

BenPython: dönüştürme liste istisna işleme ile çok boyutlu dict için anahtarlar dict için

dict1 = {'key21':{'key31': {'key41':val41}, 'key32':{'key42':val42}}} 

Apriori şöyle görünüyor boyutlu sözlüklerde koleksiyonu, ben yok sözlüğün boyutlarını bilmek gerekir. Muhtemel anahtarlardan oluşan büyük bir koleksiyonum var ve her sözlük anahtarlar içerebilir veya içermeyebilir. Mevcut olsa bile, tuşların aynı sırada olması gerekmeyebilir.

ben koleksiyonundan olası anahtar değerler listesi oluşturursam get komuta

istisna olarak, benzer taşıma dict1['key21']['key32']['key42'] değerini alabilmeleri

list1 = ['key21', 'key32', 'key42'] 

nasıl anahtar olarak liste geçebilir demek

+1

İyi bir ilk başlangıç, bazı kodları yazarak olurdu ... – martineau

cevap

3

Bunu, iteratif sözlüğü sorgulayabilir:

dict1 = {'key21':{'key31': {'key41':41}, 'key32':{'key42':42}}} 
list1 = ['key21', 'key32', 'key42'] 
#list1 = ['key21', 'key32', 'key42', 'bad-key'] # Test bad key 
item = dict1 
try: 
    for key in list1: 
      item = item[key] 
except (KeyError, TypeError): 
    print None 
else: 
    print item 

KeyError vaka wh kolları Anahtar mevcut değil. TypeError, öğenin bir sözlük olmadığı durumu ele alır ve bundan dolayı daha fazla arama yapılamaz. Bu kaçırılması kolay bir ilginç durumdur (ilk defa yaptım).

+0

Neden sadece 'item = dict1 [liste1 [0]] [list1 [1]] [list1 [2]] '' '' '' içinde '? OP'ye göre – martineau

+0

; "Apriori, ne sözlüklerin ne de anahtar-değerlerin ne olduğunu bilmiyorum". – th3an0maly

+0

O halde OP listede kaç anahtarın geçeceğini biliyor? – martineau