首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python dictionary.keys()错误

Python dictionary.keys()错误
EN

Stack Overflow用户
提问于 2012-01-21 22:12:13
回答 5查看 89.9K关注 0票数 42

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

代码语言:javascript
运行
复制
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'])

它应该只打印‘音乐’,‘视频’,除非我疯了。

到底怎么回事?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-21 22:18:07

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

代码语言:javascript
运行
复制
>>> b = { 'video':0, 'music':23 }
>>> k = list(b.keys())
>>> k
['music', 'video']

或者只是

代码语言:javascript
运行
复制
>>> list(b)
['music', 'video']
票数 91
EN

Stack Overflow用户

发布于 2012-01-21 22:18:20

如果您像这样分配k

代码语言:javascript
运行
复制
k = list(b.keys())

您的代码将会正常工作。

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

票数 8
EN

Stack Overflow用户

发布于 2016-01-02 03:11:14

这是Python 2和3之间的突破性变化之一。

在Python 2中:

代码语言:javascript
运行
复制
>>> help(dict.keys)
keys(...)
    D.keys() -> list of D's keys

在Python 3中:

代码语言:javascript
运行
复制
>>> help(dict.keys)
keys(...)
    D.keys() -> a set-like object providing a view on D's keys

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

这一改变意味着你不必每次都创建一个新的关键点列表,每次你想要与dict的关键点进行某种集合比较时。

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

为了帮助过渡到Python3,Python2.7有另一个dict方法,viewkeysviewkeys方法与Python3的dict.keys方法非常相似:

代码语言:javascript
运行
复制
>>> 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

代码语言:javascript
运行
复制
>>> d
{'d': None, 'a': None, 'c': None, 'b': None}
>>> list(d.keys())
['d', 'a', 'c', 'b']

或者直接将dict传递给list,因为dict无论如何都会遍历它的键:

代码语言:javascript
运行
复制
>>> list(d)
['d', 'a', 'c', 'b']

您可以创建一个实用函数来对2和3的行为进行抽象:

代码语言:javascript
运行
复制
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中,您将获得相同的输出:

代码语言:javascript
运行
复制
>>> d
{'b': None, 'a': None, 'c': None, 'd': None}
>>> keys(d)
dict_keys(['b', 'a', 'c', 'd'])
>>> list(d)
['b', 'a', 'c', 'd']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8953627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档