Python dictionary.keys()错误

时间:2012-01-21 14:12:13

标签: python python-3.x dictionary python-3.2

我正在尝试使用.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'])
除非我发疯,否则它应该只打印['音乐','视频']。

发生了什么事?

5 个答案:

答案 0 :(得分:90)

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

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

或只是

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

答案 1 :(得分:8)

如果你这样指定k

k = list(b.keys())

您的代码将有效。

如错误所示,dict_keys类型不支持索引。

答案 2 :(得分:2)

这是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方法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']

或者只是将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']

答案 3 :(得分:0)

如果您只想要一本字典中的键列表,您可以直接这样做:

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

key_list将包含所有键名作为列表,但如果多次找到,则不会重复键。重复的密钥将被计为一个。

答案 4 :(得分:-2)

import random
b = { 'video':0, 'music':23,"picture":12 }
random.choice(tuple(b.items()))

# Returns a random dictionary entry as a tuple:
# ('music', 23)