为什么在python中迭代字典时需要调用.iteritems()?
为什么你必须调用iteritems()
来迭代字典中的键值对呢? 即
dic = {'one':'1', 'two':'2'} for k, v in dic.iteritems(): print k, v
为什么不是迭代字典的默认行为
for k, v in dic: print k, v
对于每个python容器C,期望是这样的
for item in C: assert item in C
会传递得很好 – 如果(循环语句)中的某种意义与另一个意义(存在检查)有完全不同的意义, 你会不会觉得奇怪? 我当然会! 它自然适用于列表,集合,元组,…
所以,当C
是一个字典时,如果in
for
循环中产生键/值元组,那么,根据最less惊讶的原则, in
遏制检查中也将不得不将这样一个元组作为它的左手操作数。
那有多好? 相当无用的,基本上使if (key, value) in C
的同义词if C.get(key) == value
– 这是一个检查,我相信我可能已经执行,或想要执行, if k in C
实际上意味着什么 ,只检查密钥的存在而完全忽略这个值。
另一方面,想要在键上循环是相当普遍的,例如:
for k in thedict: thedict[k] += 1
具有这个价值也无济于事:
for k, v in thedict.items(): thedict[k] = v + 1
实际上有点不太清晰,简洁。 (请注意, items
是用于获取键/值对的“正确”方法的原始拼写:不幸的是,当这样的访问器返回整个列表的时候,所以为了支持“只是迭代”替代拼写必须是在Python 3中,与之前Python版本的向后兼容性约束被大大削弱了,它又变成了items
)。
我的猜测:使用完整的元组将会更直观地进行循环,但是对于使用in
成员进行testing可能更less。
if key in counts: counts[key] += 1 else: counts[key] = 1
如果您必须为in
指定键和值,那么该代码将不会真正起作用。 我很难想象使用情况,你会检查是否在字典中的关键AND值。 仅testing按键就更自然了。
# When would you ever write a condition like this? if (key, value) in dict:
现在运营商和运营商不需要对相同的项目for ... in
操作。 实施方面,他们是不同的操作( __contains__
与__iter__
)。 但是,这种小小的不一致性会让人感到困惑,而且是不一致的。