Jak usunąć klucz ze słownika Pythona?

Próbując usunąć klucz ze słownika, piszę:

if 'key' in myDict:
    del myDict['key']

Czy jest jeden sposób na zrobienie tego?

Author: Peter Mortensen, 2012-07-01

8 answers

Użycie dict.pop():

my_dict.pop('key', None)

Zwróci my_dict[key] Jeśli key istnieje w słowniku, a None w przeciwnym razie. Jeżeli drugi parametr nie jest określony (tj. my_dict.pop('key')) I key nie istnieje, powstaje KeyError.

 1849
Author: Sven Marnach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-05 23:23:34

W szczególności, aby odpowiedzieć " czy jest jeden sposób, aby to zrobić?"

if 'key' in myDict: del myDict['key']

...Cóż, ty zapytał ;-)

Należy jednak wziąć pod uwagę, że ten sposób usuwania obiektu z dict jest nie atomowy -jest możliwe, że 'key' może być w myDict podczas if, ale może być usunięty przed wykonaniem del, w którym to przypadku del nie powiedzie się z KeyError. Biorąc to pod uwagę, najbezpieczniej byłoby użyć dict.pop albo coś w tym stylu z

try:
    del myDict['key']
except KeyError:
    pass

Który, oczywiście, jest zdecydowanie a nie jednowierszowym.

 270
Author: zigg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

Zajęło mi trochę czasu, aby dowiedzieć się, co dokładnie my_dict.pop("key", None) robi. Więc dodam to jako odpowiedź, aby zaoszczędzić innym czas googlowania:

Pop(klawisz [, domyślnie])

Jeśli klucz znajduje się w słowniku, usuń go i zwróć jego wartość, w przeciwnym razie return default. Jeśli nie podano wartości domyślnej, a klucz nie znajduje się w dictionary, a keyerror is raised

Dokumentacja

 117
Author: Akavall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-27 17:29:44

Czas trzech rozwiązań opisanych powyżej.

Mały słownik:

>>> import timeit
>>> timeit.timeit("d={'a':1}; d.pop('a')")
0.23399464370632472
>>> timeit.timeit("d={'a':1}; del d['a']")
0.15225347193388927
>>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
0.5365207354998063

Większy słownik:

>>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
5.478138627299643
>>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
5.362219126590048
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
13.93129749387532
 27
Author: Peter Smit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 12:19:22

Jeśli potrzebujesz usunąć wiele kluczy ze słownika w jednej linijce kodu, myślę, że użycie map () jest dość zwięzłe i czytelne dla Pythona:

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}

I jeśli chcesz wyłapać błędy, w których pojawi się wartość, której nie ma w słowniku, użyj lambda inside map () 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}
To działa. A "e" nie powodowało błędu, mimo że myDict nie miał klucza "e".
 21
Author: Marc Maxson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 13:53:09

Użycie:

>>> if myDict.get(key): myDict.pop(key)

Inny sposób:

>>> {k:v for k, v in myDict.items() if k != 'key'}

Możesz usunąć według warunków. Brak błędu, jeśli key nie istnieje.

 15
Author: Shameem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 13:54:23

Użycie słowa kluczowego "del":

del dict[key]
 6
Author: Sarthak Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 13:55:39

Możemy usunąć klucz ze słownika Pythona za pomocą następujących metod.

Używając słowa kluczowego del; jest to prawie to 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 zrobić tak:

Ale należy pamiętać, że w tym procesie nie usunie żadnego klucza ze słownika, a nie wyłączy z tego słownika konkretny klucz . Ponadto zauważyłem, że zwrócił słownik, który nie został uporządkowany 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 coś w stylu {'five': 500, 'four': 400, 'three': 300, 'two': 200} - zauważ, że nie jest to to samo uporządkowane co myDict. Ponownie, jeśli spróbujemy wydrukować myDict, wtedy możemy zobaczyć wszystkie klucze, w tym te, które wykluczyliśmy ze słownika dzięki temu podejściu. Jednak możemy stworzyć nowy słownik, przypisując do zmiennej następujące polecenie:

var = {key:value for key, value in myDict.items() if key != 'one'}

Teraz, jeśli spróbujemy go wydrukować, to będzie podążał za rodzicem kolejność:

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

Lub

Metodą pop().

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 a pop polega na tym, że używając metody pop(), możemy w razie potrzeby zapisać wartośćklucza , jak poniżej:

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100
 5
Author: iPython,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 13:58:04