Mam duży obiekt słownika, który ma kilka par kluczowych wartości (około 16), ale interesują mnie tylko 3 z nich. Jaki jest najlepszy sposób (najkrótszy / wydajny / najbardziej elegancki), aby to osiągnąć?
Najlepsze, co wiem to:
bigdict = {'a':1,'b':2,....,'z':26}
subdict = {'l':bigdict['l'], 'm':bigdict['m'], 'n':bigdict['n']}
Jestem pewien, że istnieje bardziej elegancki sposób niż ten. Pomysły?
źródło
bigdict
nie zawierak
{k: bigdict.get(k,None) for k in ('l', 'm', 'n')}
poradzi sobie z sytuacją, w której brakuje określonego klucza w słowniku źródłowym, ustawiając klucz w nowym dykcie na Brakbigdict.keys() & {'l', 'm', 'n'}
==>bigdict.viewkeys() & {'l', 'm', 'n'}
dla Python2.7Trochę krótszy, przynajmniej:
źródło
dict((k,bigdict.get(k,defaultVal) for k in wanted_keys)
jeśli musisz mieć wszystkie klucze.źródło
Trochę porównania prędkości dla wszystkich wymienionych metod:
Tak jak się spodziewano: najlepszym rozwiązaniem są tłumaczenia słownikowe.
źródło
Ta odpowiedź korzysta ze słownika podobnego do wybranej odpowiedzi, ale nie dotyczy wyłącznie brakującego elementu.
wersja python 2:
wersja Python 3:
źródło
Może:
Python 3 obsługuje nawet następujące:
Pamiętaj, że możesz sprawdzić istnienie w słowniku w następujący sposób:
odpowiednio dla python 3
źródło
a
Nie działa, jeśli go nie mabigdict
Okej, to mnie niepokoiło kilka razy, więc dziękuję Jayeshowi za to pytanie.
Powyższe odpowiedzi wydają się równie dobrym rozwiązaniem jak każde inne, ale jeśli używasz tego w całym kodzie, sensowne jest zawinięcie funkcjonalności IMHO. Istnieją również dwa możliwe przypadki użycia: jeden, w którym zależy Ci na tym, czy wszystkie słowa kluczowe znajdują się w oryginalnym słowniku. i taki, w którym nie. Byłoby miło traktować oba jednakowo.
Tak więc, dla mojej wartości dwóch groszy, proponuję napisanie podklasy słownika, np
Teraz możesz wyciągnąć pod-słownik za pomocą
Przykłady użycia:
Jeśli uruchomisz cały powyższy kod, powinieneś zobaczyć (coś w stylu) następujące dane wyjściowe (przepraszam za formatowanie):
źródło
subdict(orig_dict, keys, …)
?Możesz także użyć
map
(co jest bardzo przydatną funkcją do zapoznania się):sd = dict(map(lambda k: (k, l.get(k, None)), l))
Przykład:
PS: Pożyczyłem
.get(key, None)
od poprzedniej odpowiedzi :)źródło
Jeszcze jeden (wolę odpowiedź Marka Longaira)
źródło
rozwiązanie
przykłady użycia
źródło