这是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
这种行为的改变很有道理,因为字典在语义上是无序的,它的键是唯一的 - 就像集合一样。
这个改变意味着你不必每次想要用字典的键做某种集合比较时创建一个新的键列表。
为了帮助过渡到 Python 3,Python 2.7 还有另一个字典方法,`viewkeys`。`viewkeys` 方法最类似于 Python 3 的 `dict.keys` 方法:
>>> 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']
或者直接将字典传递给list
,因为字典本身会遍历其键:
>>> list(d)
['d', 'a', 'c', 'b']
您可以创建一个实用函数来抽象2和3之间的行为:
if hasattr(dict, 'viewkeys'):
def keys(d):
return d.viewkeys()
else:
def keys(d):
return d.keys()
将字典传递给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']