我正在尝试使用.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'])它应该只打印‘音乐’,‘视频’,除非我疯了。
到底怎么回事?
发布于 2012-01-21 22:18:07
Python3改变了dict.keys的行为,现在它返回一个可迭代但不可索引的dict_keys对象(就像旧的dict.iterkeys,现在已经不存在了)。您可以通过显式调用list来获取Python2结果
>>> b = { 'video':0, 'music':23 }
>>> k = list(b.keys())
>>> k
['music', 'video']或者只是
>>> list(b)
['music', 'video']发布于 2012-01-21 22:18:20
如果您像这样分配k:
k = list(b.keys())您的代码将会正常工作。
如错误所述,dict_keys类型不支持索引。
发布于 2016-01-02 03:11:14
这是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的关键点进行某种集合比较时。
在2和3中获得相同的行为
为了帮助过渡到Python3,Python2.7有另一个dict方法,viewkeys。viewkeys方法与Python3的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'])在Python3中,与旧行为最相似的是将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']https://stackoverflow.com/questions/8953627
复制相似问题