我正在尝试使用.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'])
除非我发疯,否则它应该只打印['音乐','视频']。
发生了什么事?
答案 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键进行某种设置比较时都不必创建新的键列表。
为了帮助过渡到Python 3,Python 2.7有另一种dict方法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']
或者只是将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)