Python dictionary.keys()错误

我正在尝试使用.keys() ,而不是像过去一样获取密钥列表。 但是我得到这个。

 b = { 'video':0, 'music':23 } k = b.keys() print( k[0] ) >>>TypeError: 'dict_keys' object does not support indexing print( k ) dict_keys(['music', 'video']) 

除非我疯了,否则应该只打印['音乐','video']。

这是怎么回事?

Python 3改变了dict.keys的行为,使得它现在返回一个dict_keys对象,这个对象是可迭代的但是不可索引(就像旧的dict.iterkeys ,现在已经不存在了)。 您可以通过显式调用来获取Python 2的结果:

 >>> b = { 'video':0, 'music':23 } >>> k = list(b.keys()) >>> k ['music', 'video'] 

要不就

 >>> list(b) ['music', 'video'] 

如果你这样分配k

 k = list(b.keys()) 

你的代码将工作。

正如错误所述, dict_keystypes不支持索引。

这是Python 2和Python 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 

这种行为上的改变很有意义,因为字典在语义上是无序的,而且它的关键是独一无二的,就像一个集合。

这个改变意味着你不必每次用字典的键进行某种设置比较的时候都要创build一个新的键列表。

在2和3中获得相同的行为

为了帮助转换到Python 3,Python 2.7有另外一个字典方法viewkeysviewkeys方法与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'] 

你可以创build一个实用的函数来抽象2和3的行为:

 if hasattr(dict, 'viewkeys'): # Python 2.7 def keys(d): return d.viewkeys() else: # Python 3 def keys(d): return d.keys() 

并通过一个字典list获取列表forms,并在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'] 

如果你只是想从字典中的键列表,你可以直接这样做:

 b = {"name": "xyz", "class":"abc", "college": "qwert"} key_list = list(b) 

key_list将包含所有的键名作为列表,但是,如果多次发现,这将不会重复一个键。 重复的键将被计为一个。