Проверка наличия ключа в словаре
Описание проблемы:
У меня есть словарь в Python, например, mydict = {'name':'abc', 'city':'xyz', 'country':'def'}
. Мне нужно выяснить, как проверить, существует ли ключ в словаре. Я уже знаком с несколькими способами:
if mydict.has_key('name'):
if 'name' in mydict:
Проблема в том, что метод has_key
устарел и больше не рекомендуется к использованию в современных версиях Python. Хотелось бы получить советы по наиболее современным и эффективным способам проверки наличия ключа в словаре. С какими методами или подходами вы сталкивались? Спасибо за помощь!
2 ответ(ов)
В соответствии с ответом martineau, часто лучше не проверять наличие элемента в словаре. Например, код
if x in d:
foo = d[x]
else:
foo = bar
обычно можно записать более лаконично так:
foo = d.get(x, bar)
Этот вариант короче и лучше передает суть.
Еще один распространенный случай — это код вроде следующего:
if x not in d:
d[x] = []
d[x].append(foo)
Можно переписать его следующим образом:
d.setdefault(x, []).append(foo)
А еще лучше использовать collections.defaultdict(list)
для d
, что позволит записать код так:
d[x].append(foo)
Такой подход делает код более чистым и понятным.
В контексте байт-кода операция in
сохраняет LOAD_ATTR
и заменяет CALL_FUNCTION
на COMPARE_OP
.
Например, для функции проверки наличия ключа в словаре:
>>> dis.dis(indict)
2 0 LOAD_GLOBAL 0 (name)
3 LOAD_GLOBAL 1 (d)
6 COMPARE_OP 6 (in)
9 POP_TOP
А если рассмотреть метод haskey
, то получим следующее:
>>> dis.dis(haskey)
2 0 LOAD_GLOBAL 0 (d)
3 LOAD_ATTR 1 (haskey)
6 LOAD_GLOBAL 2 (name)
9 CALL_FUNCTION 1
12 POP_TOP
Как видно, первый вариант с использованием оператора in
заметно более читабелен, и я бы предпочел его в большинстве случаев, которые могу представить.
Что касается производительности, время выполнения отражает различия в опкодах:
$ python -mtimeit -s'd = dict((i, i) for i in range(10000))' "'foo' in d"
10000000 loops, best of 3: 0.11 usec per loop
$ python -mtimeit -s'd = dict((i, i) for i in range(10000))' "d.has_key('foo')"
1000000 loops, best of 3: 0.205 usec per loop
Таким образом, использование in
почти в два раза быстрее.
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Есть ли питоний способ объединить два словаря (сложив значения для ключей, которые присутствуют в обоих)?