我最近写了一些类似这样的代码:
# dct is a dictionary
if "key" in dct.keys():
然而,我后来发现,我可以实现同样的结果:
if "key" in dct:
这一发现让我思考,我开始运行一些测试,看看是否存在这样的情况:当我必须使用字典的keys
方法时。但我的结论是没有,没有。
如果我想把钥匙列在单子上,我可以:
keys_list = list(dct)
如果我想遍历键,我可以:
for key in dct:
...
最后,如果我想测试一个键是否在dct
中,我可以像上面那样使用in
。
总而言之,我的问题是:我遗漏了什么吗?有没有可能我必须使用keys
方法的场景?。。。或者它只是早期安装的Python遗留下来的方法,应该被忽略吗?
在Python 3上,使用
dct.keys()
获得一个dictionary view object,它允许您仅对键执行设置操作:在Python 2中,您可以使用
dct.viewkeys()
来实现这一点。在Python 2中,
dct.keys()
返回一个列表,即字典中键的副本。这可以在一个单独的对象周围传递,该对象可以自己操作,包括在不影响字典本身的情况下删除元素;但是,您可以使用list(dct)
创建相同的列表,该列表在Python 2和3中都有效。您确实不希望将其中任何一个用于迭代或成员资格测试;请分别使用
for key in dct
和key in dct
。来源:PEP 234,PEP 3106
Python 2相对无用的
dict.keys
方法是由于历史原因而存在的。最初,口述是不可接受的。实际上,不存在迭代器;通过调用元素访问方法__getitem__
对序列进行迭代,并增加整数索引,直到出现IndexError
。要遍历dict的键,必须调用keys
方法来获取键的显式列表并遍历它。当迭代器进入时,dicts变得可iterable,因为它更方便、更快,而且更适合说
比
这样做的副作用是使
d.keys()
完全多余;list(d)
和iter(d)
现在以更干净、更一般的方式做了d.keys()
所做的一切。不过,他们无法摆脱keys
,因为有太多的代码已经调用了它。(此时,dicts还得到了一个
__contains__
方法,因此您可以说key in d
,而不是d.has_key(key)
。这与for key in d
很短且很对称;对称性也是迭代dict而不是(key,value)对的原因在Python 3中,借鉴Java集合框架,dicts的
keys
、values
和items
方法发生了变化。它们将返回原始dict的视图,而不是返回列表。键和项视图将支持set-like操作,所有视图都是底层dict的包装器,反映dict的任何更改。这使keys
再次有用。假设您没有使用Python 3,
list(dct)
等同于dct.keys()
。你用哪一个是个人喜好的问题。我个人认为dct.keys()
稍微清楚一点,但对每个人来说都是自己的。在任何情况下,都不存在“需要”使用
dct.keys()
本身的场景。在Python 3中,
dct.keys()
返回一个“dictionary视图对象”,因此,如果您需要在循环上下文之外获得键的非物质化视图(对于大型字典可能很有用),则需要使用for
。相关问题 更多 >
编程相关推荐