问题:在Python中遍历字典时,为什么必须调用.items()?
为什么需要调用items()以遍历字典中的键,值对?即。
dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
    print(k, v)为什么不是在字典上进行迭代的默认行为
for k, v in dic:
    print(k, v)回答 0
对于每个python容器C,期望是
for item in C:
    assert item in C会顺利通过- 如果一种感觉(循环子句)与另一种感觉(存在检查)完全不同,您会不会感到惊讶in?我一定会的!它自然适用于列表,集合,元组,…
因此,当C是一个字典时,如果in要for循环生成键/值元组,那么,根据最小惊讶的原理,in还必须将其元组作为其包含检查中的左操作数。
那会有用吗?好看不中用的确,基本上做if (key, value) in C的代名词if C.get(key) == value-这是一张支票,我相信我可能已经执行,或要执行,100倍以上的很少比if k in C实际手段,检查钥匙的存在只,完全无视值。
另一方面,只在键上循环很常见,例如:
for k in thedict:
    thedict[k] += 1拥有价值也无济于事:
for k, v in thedict.items():
    thedict[k] = v + 1实际上有点不太清晰和简洁。(请注意,这items是用于获取键/值对的“正确”方法的原始拼写:不幸的是,这是在此类访问器返回整个列表的时代,因此,为了支持“公正迭代”,必须引入替代拼写,并且iteritems  在-Python 3中,与以前的Python版本的向后兼容性约束被大大削弱,后来items又变成了)。
回答 1
我的猜测:使用完整的元组进行循环会更直观,但使用进行成员资格测试可能会更不那么直观in。
if key in counts:
    counts[key] += 1
else:
    counts[key] = 1如果您必须同时指定key和value,那么该代码将无法正常工作in。我很难想象用例,您将检查键和值是否都在字典中。仅测试密钥更为自然。
# When would you ever write a condition like this?
if (key, value) in dict:现在,in操作员和for ... in操作员不必对相同的项目进行操作。在实现方面,它们是不同的操作(__contains__vs. __iter__)。但是,这种微小的不一致会造成一些混乱,而且不一致。
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

