2012-07-18 15 views
5

Mam duży dyktando Pythona utworzone z danych json i tworzę mniejszy dict z dużego. Niektóre elementy dużego słownika mają klucz o nazwie "szczegóły", a niektóre elementy nie. Co chcę zrobić, to sprawdzić, czy klucz istnieje w każdym wpisie w dużym słowniku, a jeśli nie, dopisać klucz "szczegóły" z wartością "Brak dostępnych informacji" do nowego słownika. Zamieszczam przykładowy kod poniżej, jako demonstrację. LargeDict jest znacznie większy z wieloma kluczami w moim kodzie, ale utrzymuję to dla jasności.Sprawdź, czy klucz istnieje w słowniku. Jeśli nie, dołącz to

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'}]} 

ten sposób otrzymuję dane dla SmallDict:

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

uzyskać kluczową błąd jednak, gdy jeden z dużych wpisów DICT ma żadnych szczegółów. Czy mam rację mówiąc, że muszę korzystać z modułu DefaultDict, czy jest łatwiejszy sposób?

Odpowiedz

2

Zastosowanie metody get(key, defaultVar) dostarczyć wartość domyślną gdy klucz 'details' brakuje:

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

Nie potrzebujesz collections.defaultdict. Możesz użyć metody setdefault dla obiektów słownika.

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

Jak zauważyli inni, jeśli nie chcesz, aby dodać klucz do słownika, można użyć metody get.

Oto stary reference, który często znajduję się patrząc na.

+0

+1 (Od docs) dict.setdefault(): „Jeśli klucz jest w słowniku, zwraca jego wartość Jeśli nie, włóż klucz o wartości domyślnie i powrotu. domyślne, domyślne to Brak. " – heltonbiker

+0

Tak. Użyj tego. defaultdict to złe stworzenie dla nieostrożnych. – javadba

+1

FWIW, myślę, że "defaultdict" jest świetny. Głównie, nie sądzę, że warto przekonwertować zwykły 'dict' na' defaultdict', jeśli dostałeś go z innego źródła. "Zło" z 'defaultdict' może być ominięte po prostu przez ustawienie atrybutu' default_factory' na 'None' (co sprawi, że będzie się zachowywał jak zwykły dyktat po raz kolejny). – mgilson

4

Możesz użyć collections.defaultdict, jeśli chcesz automatycznie utworzyć wpis w swoim dict. Jeśli jednak nie, i po prostu chcą „Niedostępne” (lub cokolwiek), a następnie można po prostu przypisać do dict jak d[key] = v i używać d.get(k, 'Not available') do wartości domyślnej

Powiązane problemy