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?
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
.
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.
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
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
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".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.
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]
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
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