Odpowiedzi:
Aby usunąć klucz bez względu na to, czy znajduje się w słowniku, użyj dwuargumentowej formy dict.pop()
:
my_dict.pop('key', None)
Zwróci to, my_dict[key]
jeśli key
istnieje w słowniku i None
inaczej. Jeśli drugi parametr nie jest określony (tj. my_dict.pop('key')
) I key
nie istnieje, to KeyError
jest wywoływane a.
Aby usunąć klucz, który na pewno istnieje, możesz również użyć
del my_dict['key']
Spowoduje to podniesienie a, KeyError
jeśli klucza nie ma w słowniku.
pop()
over del
: 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?”
if 'key' in my_dict: del my_dict['key']
... cóż, zapytałeś ;-)
Należy jednak wziąć pod uwagę, że ten sposób usuwania obiektu z niedict
jest atomowy - możliwe, że 'key'
może to być my_dict
podczas if
instrukcji, ale może zostać usunięte przed del
wykonaniem, w którym to przypadku del
zakończy się niepowodzeniem za pomocą KeyError
. Biorąc to pod uwagę, najbezpieczniej byłoby użyćdict.pop
albo coś w tym stylu
try:
del my_dict['key']
except KeyError:
pass
co oczywiście nie jest jednoskładnikowe.
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, ale try
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:
pop(key[, default])
Jeśli klucz znajduje się w słowniku, usuń go i zwróć jego wartość, w przeciwnym razie zwróć wartość domyślną . Jeśli wartość domyślna nie jest podana, a klucza nie ma w słowniku,
KeyError
zostanie podniesiona wartość a.
dict.pop?
w IPython.
del my_dict[key]
jest nieco szybszy niż w my_dict.pop(key)
przypadku usuwania klucza ze słownika, gdy klucz istnieje
>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"
>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786
Ale 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 instrukcji try
/ except
:
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133
pop
na a del
. Utworzenie słownika całkowicie przyćmiewa usuwanie z niego rzeczy.
del
i pop
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:
myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}
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:
map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}
lub w python3
, zamiast tego musisz użyć rozumienia listy:
[myDict.pop(x, None) for x in ['a', 'c', 'e']]
To działa. I „e” nie spowodowało błędu, mimo że myDict nie miał klucza „e”.
map
i przyjaciele są teraz leniwi i zwracają iteratory. Stosowanie w map
przypadku działań niepożądanych jest ogólnie uważane za złą praktykę; standardowa for ... 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ę dla map
(i filter
).
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, np loop(d.pop(k) for k in ['a', 'b'])
.
Używając słowa kluczowego „del”:
del dict[key]
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 -
myDict = {'one': 100, 'two': 200, 'three': 300 }
print(myDict) # {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : del myDict['one']
print(myDict) # {'two': 200, 'three': 300}
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
.
myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}
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ść co myDict
. 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:
var = {key:value for key, value in myDict.items() if key != 'one'}
Teraz, jeśli spróbujemy go wydrukować, będzie on zgodny z kolejnością nadrzędną:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
Lub
Przy użyciu pop()
metody
myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)
if myDict.get('one') : myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
Różnica między del
i pop
polega na tym, że za pomocą pop()
metody możemy w razie potrzeby przechowywać wartość klucza , na przykład:
myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var) # 100
Rozwiąż tę istotę do wykorzystania w przyszłości, jeśli okaże się to przydatne.
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:
try:
del dict[key]
except KeyError: pass
Jest to jednak wolniejsze niż pop()
metoda, jeśli klucz nie istnieje.
my_dict.pop('key', None)
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:
if 'key' in dict:
del myDict['key']
Ale ta metoda jest niebezpieczna, ponieważ jeśli 'key'
zostanie usunięta między dwiema liniami, KeyError
zostanie podniesiona a.
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ć.
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair
# removes vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))
Wynik:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}
to się zmieni
my_dict
w miejscu (zmienne)
my_dict.pop('key', None)
wygeneruj nowy dykt (niezmienny)
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)