0

Проверка наличия ключа в словаре

10

Описание проблемы:

У меня есть словарь в Python, например, mydict = {'name':'abc', 'city':'xyz', 'country':'def'}. Мне нужно выяснить, как проверить, существует ли ключ в словаре. Я уже знаком с несколькими способами:

  1. if mydict.has_key('name'):
  2. if 'name' in mydict:

Проблема в том, что метод has_key устарел и больше не рекомендуется к использованию в современных версиях Python. Хотелось бы получить советы по наиболее современным и эффективным способам проверки наличия ключа в словаре. С какими методами или подходами вы сталкивались? Спасибо за помощь!

2 ответ(ов)

0

В соответствии с ответом 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)

Такой подход делает код более чистым и понятным.

0

В контексте байт-кода операция 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 почти в два раза быстрее.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь