为什么使用dict.keys?

2024-05-21 04:19:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近写了一些类似这样的代码:

# 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遗留下来的方法,应该被忽略吗?


Tags: 方法key代码indictionaryif字典is
3条回答

在Python 3上,使用dct.keys()获得一个dictionary view object,它允许您仅对键执行设置操作:

>>> for sharedkey in dct1.keys() & dct2.keys():  # intersection of two dictionaries
...     print(dct1[sharedkey], dct2[sharedkey])

在Python 2中,您可以使用dct.viewkeys()来实现这一点。

在Python 2中,dct.keys()返回一个列表,即字典中键的副本。这可以在一个单独的对象周围传递,该对象可以自己操作,包括在不影响字典本身的情况下删除元素;但是,您可以使用list(dct)创建相同的列表,该列表在Python 2和3中都有效。

您确实不希望将其中任何一个用于迭代或成员资格测试;请分别使用for key in dctkey in dct

来源:PEP 234PEP 3106

Python 2相对无用的dict.keys方法是由于历史原因而存在的。最初,口述是不可接受的。实际上,不存在迭代器;通过调用元素访问方法__getitem__对序列进行迭代,并增加整数索引,直到出现IndexError。要遍历dict的键,必须调用keys方法来获取键的显式列表并遍历它。

当迭代器进入时,dicts变得可iterable,因为它更方便、更快,而且更适合说

for key in d:

for key in d.keys()

这样做的副作用是使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的keysvaluesitems方法发生了变化。它们将返回原始dict的视图,而不是返回列表。键和项视图将支持set-like操作,所有视图都是底层dict的包装器,反映dict的任何更改。这使keys再次有用。

假设您没有使用Python 3,list(dct)等同于dct.keys()。你用哪一个是个人喜好的问题。我个人认为dct.keys()稍微清楚一点,但对每个人来说都是自己的。

在任何情况下,都不存在“需要”使用dct.keys()本身的场景。

在Python 3中,dct.keys()返回一个“dictionary视图对象”,因此,如果您需要在循环上下文之外获得键的非物质化视图(对于大型字典可能很有用),则需要使用for

相关问题 更多 >