iCo*_*dez 26 python dictionary
我最近写了一些看起来像这样的代码:
# dct is a dictionary
if "key" in dct.keys():
Run Code Online (Sandbox Code Playgroud)
但是,我后来发现我可以用以下方法获得相同的结果:
if "key" in dct:
Run Code Online (Sandbox Code Playgroud)
这个发现让我思考,我开始运行一些测试,看看是否有必须使用keys字典方法的场景.然而,我的结论是否定的,没有.
如果我想要列表中的键,我可以这样做:
keys_list = list(dct)
Run Code Online (Sandbox Code Playgroud)
如果我想迭代键,我可以这样做:
for key in dct:
...
Run Code Online (Sandbox Code Playgroud)
最后,如果我想测试一个密钥是否在dct,我可以in像上面那样使用.
总而言之,我的问题是:我错过了什么吗?难道有一种场景我必须使用这个keys方法吗?...或者它只是一个应该被忽略的早期Python安装的剩余方法?
Mar*_*ers 24
在Python 3上,用于dct.keys()获取字典视图对象,它允许您仅对键进行设置操作:
>>> for sharedkey in dct1.keys() & dct2.keys(): # intersection of two dictionaries
... print(dct1[sharedkey], dct2[sharedkey])
Run Code Online (Sandbox Code Playgroud)
在Python 2中,您可以使用dct.viewkeys()它.
在Python 2中,dct.keys()返回一个列表,一个字典中的键的副本.这可以围绕一个单独的对象传递,该对象可以自己操作,包括删除元素而不影响字典本身; 但是,您可以创建相同的列表list(dct),它在Python 2和3中都有效.
您确实不希望其中任何一个用于迭代或成员资格测试; 总是分别用于for key in dct和key in dct那些人.
use*_*ica 10
dict.keys由于历史原因,Python 2的相对无用的方法存在.最初,dicts不可迭代.事实上,没有迭代器这样的东西; 通过调用__getitem__元素访问方法迭代序列工作,增加整数索引直到IndexError引发.要遍历dict的键,您必须调用该keys方法以获取明确的键列表并迭代它.
当迭代器进入时,dicts变得可迭代,因为它更方便,更快速,并且更好地说
for key in d:
Run Code Online (Sandbox Code Playgroud)
比
for key in d.keys()
Run Code Online (Sandbox Code Playgroud)
这具有d.keys()完全多余的副作用; list(d)而iter(d)现在做的一切都是d.keys()在一个更清洁,更一般的方式一样.keys但是,他们无法摆脱,因为已经有如此多的代码称之为它.
(此时,dicts也有一个__contains__方法,所以你可以说key in d而不是d.has_key(key).这更短,很好地对称for key in d;对称性也是为什么迭代dict给出键而不是(键,值)对.)
在Python 3,取灵感来自Java集合框架的keys,values和items类型的字典的方法发生了变化.他们将返回原始字典的视图,而不是返回列表.键和项视图将支持类似集的操作,并且所有视图都是基础字典周围的包装器,反映了对字典的任何更改.这keys又有用了.