我最近编写了一些看起来像这样的代码:
# 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安装的剩余方法?
答案 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 dct
和key in dct
。
答案 1 :(得分:10)
由于历史原因,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中获取灵感,改变了keys
,values
和items
方法。他们将返回原始字典的视图,而不是返回列表。键和项视图将支持类似集的操作,并且所有视图都是基础字典周围的包装器,反映了对字典的任何更改。这使keys
再次有用。
答案 2 :(得分:2)
假设您没有使用Python 3,list(dct)
相当于dct.keys()
。你使用哪一个是个人喜好的问题。我个人认为dct.keys()
稍微清楚一点,但对每个人都是如此。
在任何情况下,您都不需要“需要”使用dct.keys()
本身。
在Python 3中,dct.keys()
返回一个“字典视图对象”,因此如果你需要在{{1}之外获取一个非物质化的视图(对于巨大的字典有用)循环上下文,您需要使用for
。
答案 3 :(得分:0)
键 比检查快得多 键入dict.keys()