Podczas usuwania klucza ze słownika używam:
if 'key' in my_dict:
del my_dict['key']
Czy można to zrobić w jeden sposób?
Podczas usuwania klucza ze słownika używam:
if 'key' in my_dict:
del my_dict['key']
Czy można to zrobić w jeden sposób?
Odpowiedzi:
Aby usunąć klucz bez względu na to, czy znajduje się w słowniku, użyj dwuargumentowej formy
dict.pop()
:Zwróci to,
my_dict[key]
jeślikey
istnieje w słowniku iNone
inaczej. Jeśli drugi parametr nie jest określony (tj.my_dict.pop('key')
) Ikey
nie istnieje, toKeyError
jest wywoływane a.Aby usunąć klucz, który na pewno istnieje, możesz również użyć
Spowoduje to podniesienie a,
KeyError
jeśli klucza nie ma w słowniku.źródło
pop()
overdel
: zwraca wartość tego klucza. W ten sposób możesz pobrać i usunąć wpis ze słownika w jednym wierszu kodu.try
/except
, jeśli klucz nie istnieje. Możesz znaleźć jedno lub drugie łatwiejsze do odczytania, co jest w porządku. Oba są idiomatycznym Pythonem, więc wybierz, co wolisz. Ale twierdzenie, że ta odpowiedź jest bardziej złożona lub nieefektywna, po prostu nie ma sensu.self
, więc byłoby raczej zaskakujące, gdyby to zrobiła.W szczególności, aby odpowiedzieć „czy istnieje jeden sposób na zrobienie tego?”
... cóż, zapytałeś ;-)
Należy jednak wziąć pod uwagę, że ten sposób usuwania obiektu z nie
dict
jest atomowy - możliwe, że'key'
może to byćmy_dict
podczasif
instrukcji, ale może zostać usunięte przeddel
wykonaniem, w którym to przypadkudel
zakończy się niepowodzeniem za pomocąKeyError
. Biorąc to pod uwagę, najbezpieczniej byłoby użyćdict.pop
albo coś w tym styluco oczywiście nie jest jednoskładnikowe.
źródło
pop
jest zdecydowanie bardziej zwięzły, chociaż jest jedna kluczowa zaleta robienia tego w ten sposób: od razu wiadomo, co robi.try/except
Stwierdzenie jest droższe. Zgłaszanie wyjątku jest powolne.try
jest nieznacznie szybszy, choć jeśli nie,try
jest rzeczywiście znacznie wolniejszy.pop
jest dość spójny, ale wolniejszy niż wszystkie, aletry
z nieobecnym kluczem. Zobacz gist.github.com/zigg/6280653 . Ostatecznie, to zależy od tego, jak często można się spodziewać klucz do rzeczywiście być w słowniku, i czy nie trzeba niepodzielność-i, oczywiście, czy nie jesteś angażowanie przedwczesne optymalizacji;)if 'key' in mydict: #then del...
. Musiałem wyciągnąć klucz / val ze słownika, aby poprawnie parsować, pop nie był idealnym rozwiązaniem.Zajęło mi trochę czasu, aby dowiedzieć się, co dokładnie
my_dict.pop("key", None)
robi. Dodaję to jako odpowiedź, aby zaoszczędzić czas innym użytkownikom Google:Dokumentacja
źródło
dict.pop?
w IPython.del my_dict[key]
jest nieco szybszy niż wmy_dict.pop(key)
przypadku usuwania klucza ze słownika, gdy klucz istniejeAle kiedy klucz nie istnieje,
if key in my_dict: del my_dict[key]
jest nieco szybszy niżmy_dict.pop(key, None)
. Oba są co najmniej trzy razy szybsze niżdel
w instrukcjitry
/except
:źródło
pop
na adel
. Utworzenie słownika całkowicie przyćmiewa usuwanie z niego rzeczy.del
ipop
od pierwszego zestawu taktowania powyżej)Jeśli chcesz usunąć wiele kluczy ze słownika w jednym wierszu kodu, myślę, że użycie map () jest dość zwięzłe i czytelne w języku Python:
A jeśli chcesz wychwycić błędy, w których wpisujesz wartość, której nie ma w słowniku, użyj lambda wewnątrz mapy () w następujący sposób:
lub w
python3
, zamiast tego musisz użyć rozumienia listy:To działa. I „e” nie spowodowało błędu, mimo że myDict nie miał klucza „e”.
źródło
map
i przyjaciele są teraz leniwi i zwracają iteratory. Stosowanie wmap
przypadku działań niepożądanych jest ogólnie uważane za złą praktykę; standardowafor ... in
pętla byłaby lepsza. Aby uzyskać więcej informacji, zobacz Widoki i iteratory zamiast list .[myDict.pop(i, None) for i in ['a', 'c']]
, ponieważ stanowią ogólną alternatywę dlamap
(ifilter
).for ... in
pętli.map()
, które często stosuje się ze względu na skutki uboczne. Zalecaną alternatywą w Pythonie jest rozumienie listy, które moim zdaniem jest nadal dość czytelne i poznawczo lekkie jako jednowierszowe (patrz pytanie). Obie konstrukcje, użyte tylko ze względu na skutki uboczne, w rzeczywistości dają bezużyteczną listę, która może być nieefektywna. Począwszy od Python3, nie znam wbudowanej funkcji, która może bezpiecznie i elegancko iterować przez wyrażenie generatora, bez kosztownego produktu ubocznego, nploop(d.pop(k) for k in ['a', 'b'])
.Możesz użyć słownika, aby utworzyć nowy słownik z usuniętym kluczem:
Możesz usunąć według warunków. Brak błędu, jeśli
key
nie istnieje.źródło
Używając słowa kluczowego „del”:
źródło
Możemy usunąć klucz ze słownika Python, stosując następujące metody.
Za pomocą
del
słowa kluczowego; jest to prawie takie samo podejście jak ty -Lub
Możemy wykonać następujące czynności:
Należy jednak pamiętać, że w tym procesie nie usuwa on żadnego klucza ze słownika, a nie wyklucza określony klucz ze słownika. Ponadto zauważyłem, że zwrócił słownik, który nie został zamówiony tak samo jak
myDict
.Jeśli uruchomimy go w powłoce, wykona on coś w stylu
{'five': 500, 'four': 400, 'three': 300, 'two': 200}
- zauważ, że nie jest to ta sama kolejność comyDict
. Ponownie, jeśli spróbujemy wydrukowaćmyDict
, możemy zobaczyć wszystkie klucze, w tym te, które wykluczyliśmy ze słownika dzięki temu podejściu. Możemy jednak utworzyć nowy słownik, przypisując następującą instrukcję do zmiennej:Teraz, jeśli spróbujemy go wydrukować, będzie on zgodny z kolejnością nadrzędną:
Lub
Przy użyciu
pop()
metodyRóżnica między
del
ipop
polega na tym, że za pomocąpop()
metody możemy w razie potrzeby przechowywać wartość klucza , na przykład:Rozwiąż tę istotę do wykorzystania w przyszłości, jeśli okaże się to przydatne.
źródło
if myDict.get('one')
sprawdzaj, czy klucz jest obecny! Nie udaje się, jeśli myDict [„one”] ma wartość falsey. Ponadto dyktaty nie mają właściwej kolejności, więc nie ma sensu o tym wspominać.Możesz użyć obsługi wyjątków, jeśli chcesz być bardzo szczegółowy:
Jest to jednak wolniejsze niż
pop()
metoda, jeśli klucz nie istnieje.Dla kilku klawiszy nie będzie to miało znaczenia, ale jeśli robisz to wielokrotnie, to druga metoda jest lepszym rozwiązaniem.
Najszybsze podejście to:
Ale ta metoda jest niebezpieczna, ponieważ jeśli
'key'
zostanie usunięta między dwiema liniami,KeyError
zostanie podniesiona a.źródło
Wolę niezmienną wersję
źródło
Innym sposobem jest użycie przedmiotów () + rozumienie dykt
items () w połączeniu ze zrozumieniem dict może również pomóc nam w realizacji zadania usuwania pary klucz-wartość, ale ma tę wadę, że nie jest techniką dyktowania w miejscu. Właściwie nowy dykt, jeśli zostanie utworzony, z wyjątkiem klucza, którego nie chcemy dołączać.
Wynik:
źródło
Pojedynczy filtr na kluczu
Wiele filtrów na klawiszach
źródło