Это одно из критических изменений между Python 2 и 3.
В Python 2:
>>> help(dict.keys)
keys(...)
D.keys() -> list of D's keys
В Python 3:
>>> help(dict.keys)
keys(...)
D.keys() -> a set-like object providing a view on D's keys
Это изменениев поведении много смысла, так как dict семантически неупорядочен, а его ключи уникальны - как набор.
Это изменение означает, что вам не нужно создавать новый список ключей каждый раз, когда вы хотите выполнить какое-то сравнение наборов с ключами dict.
Получение того же поведения в 2и 3
Чтобы помочь переходу на Python 3, в Python 2.7 есть еще один метод dict, viewkeys
.Метод viewkeys
наиболее похож на метод dict.keys
в Python 3:
>>> d
{'a': None, 'c': None, 'b': None, 'd': None}
>>> for k in d.viewkeys(): print k
...
a
c
b
d
>>> d.viewkeys() & set('abc')
set(['a', 'c', 'b'])
В Python 3 наиболее близким аналогом старого поведения является передача dict.keys()
в list
:
>>> d
{'d': None, 'a': None, 'c': None, 'b': None}
>>> list(d.keys())
['d', 'a', 'c', 'b']
Или просто передайте dict в list
, поскольку dict все равно будет перебирать свои ключи:
>>> list(d)
['d', 'a', 'c', 'b']
Вы можете создать служебные функции для абстрагирования поведения через 2 и 3:
if hasattr(dict, 'viewkeys'): # Python 2.7
def keys(d):
return d.viewkeys()
else: # Python 3
def keys(d):
return d.keys()
И передайте dict list
, чтобы получить форму списка, и в 2 и 3 вы получите одинаковый вывод:
>>> d
{'b': None, 'a': None, 'c': None, 'd': None}
>>> keys(d)
dict_keys(['b', 'a', 'c', 'd'])
>>> list(d)
['b', 'a', 'c', 'd']