Проверить, существует ли уже данный ключ в словаре
Чтобы понять, как это сделать, мы сначала проверяем, какие методы мы можем вызывать для словаря.
Вот методы:
d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
Python Dictionary clear() Removes all Items
Python Dictionary copy() Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys() Creates dictionary from given sequence
Python Dictionary get() Returns Value of The Key
Python Dictionary items() Returns view of dictionary (key, value) pair
Python Dictionary keys() Returns View Object of All Keys
Python Dictionary pop() Removes and returns element having given key
Python Dictionary popitem() Returns & Removes Element From Dictionary
Python Dictionary setdefault() Inserts Key With a Value if Key is not Present
Python Dictionary update() Updates the Dictionary
Python Dictionary values() Returns view of all values in dictionary
Жестоким методом проверки наличия ключа может быть метод get()
:
d.get("key")
Два других интересных методов items()
и keys()
кажутся слишком трудоемкими. Итак, давайте посмотрим, подходит ли нам метод get()
. У нас есть наш dict d
:
d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
Печать показывает, что ключ, которого у нас нет, вернет None
:
print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1
Мы можем использовать это, чтобы получить информацию, присутствует ли ключ или нет.
Но учтите это, если мы создадим dict с одним key:None
:
d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None
Указание на то, что метод get()
ненадежен, если некоторые значения могут быть None
.
У этой истории должен быть более счастливый конец. Если мы используем компаратор in
:
print('key' in d) #True
print('key2' in d) #False
Получаем верные результаты.
Мы можем проверить байт-код Python:
import dis
dis.dis("'key' in d")
# 1 0 LOAD_CONST 0 ('key')
# 2 LOAD_NAME 0 (d)
# 4 COMPARE_OP 6 (in)
# 6 RETURN_VALUE
dis.dis("d.get('key2')")
# 1 0 LOAD_NAME 0 (d)
# 2 LOAD_METHOD 1 (get)
# 4 LOAD_CONST 0 ('key2')
# 6 CALL_METHOD 1
# 8 RETURN_VALUE
Это показывает, что in
оператор сравнения не только надежнее, но даже быстрее, чем get()
.
Вызов
dict.keys()
создает список ключей согласно документации docs.python.org/2/library/stdtypes.html#dict.keys, но я был бы удивлен, если бы этот шаблон не был оптимизирован ибо в серьезной реализации преобразовать вif 'key1' in dict:
.Итак, я наконец выяснил, почему многие из моих скриптов Python были такими медленными :) :(. Это потому, что я использовал
x in dict.keys()
для проверки ключей. И это произошло потому, что обычный способ перебора ключей в Java -for (Type k : dict.keySet())
, эта привычка заставляетfor k in dict.keys()
казаться более естественным, чемfor k in dict
(что по-прежнему должно быть хорошо с точки зрения производительности?), но тогда проверка ключей тоже становитсяif k in dict.keys()
, что является проблемой ...@EvgeniSergeev
if k in dict_:
проверяет наличие k в КЛЮЧАХ dict_, поэтому вам все равно не нуженdict_.keys()
. (Это меня укусило, так как мне кажется, что это тестирование для значения в dict. Но это не так.)@ToolmakerSteve Верно, но это не только вам не нужно, но и плохая практика.
Попробуйте "ввести dict"