Oto mój jeden-liner:
# returns False or the value of the end element
reduce(lambda x, y: x and y in x and x[y], list_of_keys, target_dictionary)
Przykład:
a = {'b': {'c': {'d': True}}}
reduce(lambda x, y: x and y in x and x[y], ['b', 'c', 'd'], a) # True
reduce(lambda x, y: x and y in x and x[y], ['b', 'cd', 'd'], a) # False
Jak to działa: w każdej iteracji zmniejszyć, sprawdza czy previouis klucze były w słowniku docelowej (x
) . Jeśli nie, zwróci False z powodu warunku and
natychmiast i rozpropaguje go na liście. Następnie sprawdzi, czy żądany klucz znajduje się w dykcie (x in y
). Jeśli tak, przejdzie przez słownik niższego poziomu na niższy poziom jako x
.
Uwaga: ostatni element (a ['b'] ['c'] ['d']) musi mieć wartość True. Jeśli spodziewasz się fałszywej na końcu, sprawdź ostatni poziom jawnie: 'd' in reduce(...)
Możesz użyć 'dict.get' -' my_dict [i] .get ('level_1', {}). Get ('level_2', { }). get ('my_var') '. Będzie "Brak", jeśli nie zostanie znaleziony. – jonrsharpe
lub blok 'try-except KeyError' –
Twoje podejście będzie zależeć wyłącznie od tego, co próbujesz osiągnąć i od pożądanego zachowania. Proste 'my_var = my_dict [i] ['level_1'] ['level_2'] ['my_var']' owinięte w 'try-except 'może być sposobem, aby przejść, lub co zaproponował jonsharpe, w zależności od charakteru ciebie dane. –