为什么要使用dict.keys?

时间:2013-07-13 20:58:31

标签: python dictionary

我最近编写了一些看起来像这样的代码:

# 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安装的剩余方法?

4 个答案:

答案 0 :(得分:24)

在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

答案 1 :(得分:10)

来源:PEP 234PEP 3106

由于历史原因,Python 2存在相对无用的dict.keys方法。最初,dicts不可迭代。事实上,没有迭代器这样的东西;通过调用__getitem__(元素访问方法)迭代序列,使用增加的整数索引,直到引发IndexError。要遍历dict的键,您必须调用keys方法来获取明确的键列表并迭代它。

当迭代器进入时,dicts变得可迭代,因为它更方便,更快,并且更好地说

for key in d:

大于

for key in d.keys()

这有使d.keys()完全多余的副作用; list(d)iter(d)现在以更清洁,更一般的方式完成了d.keys()所做的一切。但是,他们无法摆脱keys,因为已经有如此多的代码称之为。{/ p>

(此时,dicts也有一个__contains__方法,所以你可以说key in d而不是d.has_key(key)。这个更短,与for key in d非常对称;对称也是为什么迭代dict给出键而不是(键,值)对。)

在Python 3中,从Java Collections Framework中获取灵感,改变了keysvaluesitems方法。他们将返回原始字典的视图,而不是返回列表。键和项视图将支持类似集的操作,并且所有视图都是基础字典周围的包装器,反映了对字典的任何更改。这使keys再次有用。

答案 2 :(得分:2)

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

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

在Python 3中,dct.keys()返回一个“字典视图对象”,因此如果你需要在{{1}之外获取一个非物质化的视图(对于巨大的字典有用)循环上下文,您需要使用for

答案 3 :(得分:0)

字典中的

键 比检查快得多 键入dict.keys()