Mam taki, dict
który ma całą masę wpisów. Interesuje mnie tylko kilka wybranych. Czy istnieje prosty sposób na przycięcie wszystkich pozostałych?
python
dictionary
mpen
źródło
źródło
Odpowiedzi:
Konstruowanie nowego dykta:
Korzysta ze słownika.
Jeśli używasz wersji, która ich nie ma (tj. Python 2.6 i wcześniejsze), zrób to
dict((your_key, old_dict[your_key]) for ...)
. To jest to samo, choć brzydsze.Zauważ, że w przeciwieństwie do wersji jnnnnn, ma stabilną wydajność (zależy tylko od liczby twoich_kluczy) dla
old_dict
s dowolnego rozmiaru. Zarówno pod względem szybkości, jak i pamięci. Ponieważ jest to wyrażenie generatora, przetwarza jeden element na raz i nie przegląda wszystkich elementów old_dict.Usuwanie wszystkiego na miejscu:
źródło
old_dict
wskazuje na błąd w innym miejscu, i w takim przypadku zdecydowanie wolę błąd niż cicho błędne wyniki.Nieco bardziej eleganckie rozumienie nagrań:
źródło
mydict.iteritems()
zamiast tego..items()
tworzy kolejną listę.Oto przykład w Pythonie 2.6:
Część filtrująca to
if
instrukcja.Ta metoda jest wolniejsza niż odpowiedź delnana, jeśli chcesz wybrać tylko kilka bardzo wielu kluczy.
źródło
if key in ('x','y','z')
.Możesz to zrobić za pomocą funkcji projektu z mojej biblioteki funcy :
Zobacz także select_keys .
źródło
Kod 1:
Kod 2:
Kod 3:
Wszystkie składowe wydajności kodu są mierzone za pomocą timeit przy użyciu liczby = 1000 i gromadzone 1000 razy dla każdego fragmentu kodu.
W Pythonie 3.6 wydajność trzech sposobów filtrowania kluczy dyktowania jest prawie taka sama. Dla Pythona 2.7 kod 3 jest nieco szybszy.
źródło
Ta liner lambda powinna działać:
Oto przykład:
Jest to podstawowe rozumienie listy, iterujące po klawiszach dict (i in x) i wyświetla listę par krotek (klucz, wartość), jeśli klucz znajduje się na żądanej liście kluczy (y). Dict () otacza całość, by wyprowadzić ją jako obiekt dict.
źródło
set
dowanted_keys
, ale poza tym wygląda dobrze.dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))
:, zwraca{'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}
zgodnie z przeznaczeniem.dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}
i wynik był taki{}
, że zakładałem, że jest to puste zdanie.foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))
:, dostanę:{'0': [1, 3], '2': [1, 4]}
co jest zamierzonym rezultatemBiorąc pod uwagę oryginalny słownik
orig
i zestaw pozycji, którymi jesteś zainteresowanykeys
:co nie jest tak miłe jak odpowiedź Delnana, ale powinno działać w każdej interesującej wersji Pythona. Jest jednak delikatny dla każdego elementu
keys
istniejącego w oryginalnym słowniku.źródło
Na podstawie zaakceptowanej odpowiedzi delnan.
Co zrobić, jeśli jednego z twoich poszukiwanych kluczy nie ma w old_dict? Rozwiązanie Delnan zgłosi wyjątek KeyError, który można przechwycić. Jeśli nie tego potrzebujesz, może chcesz:
uwzględniaj tylko klucze, które istnieją zarówno w old_dict, jak i w zestawie „Want_Key”.
mają wartość domyślną dla kluczy, która nie jest ustawiona w old_dict.
źródło
{k: old_dict.get(k, default) for k in ...}
Ta funkcja załatwi sprawę:
Podobnie jak wersja delnan, ta wykorzystuje rozumienie słownika i ma stabilną wydajność dla dużych słowników (zależnie tylko od liczby dozwolonych kluczy, a nie od całkowitej liczby kluczy w słowniku).
I podobnie jak wersja MyGGan, ta pozwala na dołączenie do listy kluczy kluczy, które mogą nie istnieć w słowniku.
Jako bonus, oto odwrotność, w której można utworzyć słownik, wykluczając niektóre klucze w oryginale:
Zauważ, że w przeciwieństwie do wersji delnana, operacja nie jest wykonywana na miejscu, więc wydajność zależy od liczby kluczy w słowniku. Zaletą tego jest jednak to, że funkcja nie modyfikuje podanego słownika.
Edycja: Dodano osobną funkcję wykluczania niektórych kluczy ze słownika.
źródło
keys
na dowolny rodzaj iteracji, jak na przykład zestaw akceptuje.invert
oznacza, żekeys
argument jest podtrzymywany, czykeys
argument jest odrzucany?”, Ilu z nich się zgodzi?Jeśli chcemy stworzyć nowy słownik z usuniętymi wybranymi kluczami, możemy skorzystać ze słownika
Na przykład:
źródło
Inna opcja:
Ale otrzymujesz
list
(Python 2) lub iterator (Python 3)filter()
, a niedict
.źródło
filtered
wdict
i wrócisz do słownika!Skrócona forma:
Ponieważ większość odpowiedzi sugerują, w celu zachowania zwięzłości musimy utworzyć duplikat obiektu czy to
list
lubdict
. Ten tworzy wyrzucenie,list
ale usuwa klucze w oryginaledict
.źródło
Oto kolejna prosta metoda wykorzystująca
del
w jednym wkładce:e_keys
to lista kluczy do wykluczenia. Zaktualizuje twój dykt, a nie da ci nowy.Jeśli chcesz nowego nagrania wyjściowego, wykonaj jego kopię przed usunięciem:
źródło
Możesz użyć
python-benedict
, to podklasa dict.Instalacja:
pip install python-benedict
Jest open-source na GitHub: https://github.com/fabiocaccamo/python-benedict
Oświadczenie: Jestem autorem tej biblioteki.
źródło