Зачем использовать dict.keys?

Недавно я написал код, который выглядел примерно так:

# dct is a dictionary if "key" in dct.keys(): 

Тем не менее, я позже обнаружил, что могу добиться таких же результатов:

 if "key" in dct: 

Это открытие заставило меня задуматься, и я начал запускать некоторые тесты, чтобы увидеть, может ли быть сценарий, когда я должен использовать метод keys словаря. Однако мой вывод – нет, нет.

Если мне нужны ключи в списке, я могу сделать:

 keys_list = list(dct) 

Если я хочу перебирать ключи, я могу сделать:

 for key in dct: ... 

Наконец, если я хочу проверить, есть ли ключ в dct , я могу использовать его, как я сделал выше.

Поднял, мой вопрос: я что-то упускаю? Может ли быть когда-нибудь сценарий, когда я должен использовать метод keys ? … или это просто метод останова из более ранней установки Python, который следует игнорировать?

3 Solutions collect form web for “Зачем использовать dict.keys?”

На Python 3 используйте dct.keys() чтобы получить объект просмотра словаря , который позволяет выполнять операции только с ключами:

 >>> for sharedkey in dct1.keys() & dct2.keys(): # intersection of two dictionaries ... print(dct1[sharedkey], dct2[sharedkey]) 

В Python 2 для этого вы должны использовать dct.viewkeys() .

В Python 2 dct.keys() возвращает список, копию ключей в словаре. Это может быть передано вокруг отдельного объекта, который можно манипулировать по своему усмотрению, включая удаление элементов, не затрагивающих самого словаря; однако вы можете создать тот же список со list(dct) , который работает как в Python 2, так и 3.

Вы действительно не хотите ни одного из них для тестирования итераций или членства; всегда используйте for key in dct и key in dct для них, соответственно.

Источник: PEP 234 , PEP 3106

По историческим причинам существует довольно бесполезный метод dict.keys Python 2. Первоначально, dicts не были итерируемыми. На самом деле не было такого понятия, как итератор; итерации над последовательностями, обработанных вызовом __getitem__ , методом доступа к элементу, с увеличением целочисленных индексов до тех пор, пока не IndexError поднят IndexError . Чтобы перебирать ключи dict, вам нужно вызвать метод keys чтобы получить явный список ключей и перебрать его.

Когда итераторы вошли, дикты стали истребимыми, потому что было удобнее, быстрее, и все вокруг лучше сказать

 for key in d: 

чем

 for key in d.keys() 

Это имело побочный эффект создания d.keys() совершенно лишнего; list(d) и iter(d) теперь сделали все, что d.keys() сделал в более чистом, более общем виде. Однако они не могли избавиться от keys , поскольку так много кода уже называли это.

(В это время dicts также получил метод __contains__ , поэтому вы могли бы d.has_key(key) key in d вместо d.has_key(key) . Это было короче и красиво симметрично с for key in d ; симметрия также объясняется тем, почему итерация по диктору дает ключи вместо пар (ключ, значение).)

В Python 3, вдохновляясь Framework Java Collections Framework, были изменены keys , values и items методов dicts. Вместо того, чтобы возвращать списки, они возвращают представления оригинального dict. Представления ключей и элементов будут поддерживать операции типа типа, и все представления будут обертки вокруг базового dict, отражающие любые изменения в dict. Это снова помогло keys .

Предполагая, что вы не используете Python 3, list(dct) эквивалентен dct.keys() . Какой из них вы используете, это вопрос личных предпочтений. Я лично думаю, что dct.keys() немного яснее, но каждому свой.

В любом случае нет сценария, в котором вам «нужно» использовать dct.keys() как таковой.

В Python 3, dct.keys() возвращает «объект представления словаря», поэтому, если вам нужно получить представление о нематериализованном представлении ключей (что может быть полезно для огромных словарей) вне контекста цикла for , d нужно использовать dct.keys() .

  • Проверьте, существует ли определенный ключ и значение в словаре
  • В словаре вывод не получает ожидаемого в PYTHON
  • Как элегантно проверить, имеет ли словарь определенную структуру?
  • Python Pandas: как разбить отсортированный словарь в столбце кадра данных
  • Как отсортировать словари по ключам в Python
  • Как обернуть python dict?
  • Как правильно исключить элементы в словаре до тех пор, пока не останется одна строка
  • Доступ к произвольному элементу в словаре в Python
  • Добавление константного целого числа в значение в словаре python
  • Получение разницы (дельта) между двумя списками словарей
  • Могу ли я получить доступ к английскому словарю для прокрутки совпадений в морском коде? Если нет, я могу скопировать и вставить его из какого-либо места на несколько строк?
  • Python - лучший язык программирования в мире.