为什么在python中遍历字典时必须调用.iteritems()?

2024-05-13 13:50:47 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么要调用iteritems()来遍历字典中的键和值对?工业工程

dic = {'one':'1', 'two':'2'}
for k, v in dic.iteritems():
    print k, v

为什么这不是遍历字典的默认行为

for k, v in dic:
    print k, v

Tags: infor字典工程oneprint工业two
2条回答

我的猜测是:对于循环使用完整元组会更直观,但是对于使用in测试成员资格来说可能不那么直观。

if key in counts:
    counts[key] += 1
else:
    counts[key] = 1

如果必须同时为in指定键和值,那么该代码就不会真正工作。我很难想象这样一个用例,您可以在其中检查键和值是否都在字典中。只测试钥匙要自然得多。

# When would you ever write a condition like this?
if (key, value) in dict:

现在不需要in运算符和for ... in对相同的项进行操作。在实现方面,它们是不同的操作(__contains____iter__)。但这种小小的不一致会让人有些困惑,嗯,不一致。

对于每个python容器C,期望是

for item in C:
    assert item in C

如果一个in(loop子句)的含义与另一个(presence check)的完全不同,您会不会觉得很奇怪?我当然会!对于列表、集合、元组。。。

因此,当C是一个字典时,如果in要在for循环中生成键/值元组,那么,根据最小惊讶原则,in还必须在包含检查中将这样的元组作为其左手操作数。

那有多有用?实际上相当没用,基本上把if (key, value) in C变成if C.get(key) == value的同义词——这是我认为我可能已经执行或想要执行的一项检查,比if k in C实际意思是的少100倍,只检查键的存在,完全忽略该值。

另一方面,只想在键上循环是很常见的,例如:

for k in thedict:
    thedict[k] += 1

同样具有价值也不会特别有帮助:

for k, v in thedict.items():
    thedict[k] = v + 1

实际上有点不太清楚,也不太简洁。(注意items是用于获取键/值对的“正确”方法的原始拼写:不幸的是,那是在这样的访问器返回整个列表的时候,所以为了支持“只是迭代”,必须引入另一种拼写,而iteritems在Python 3中,在向后兼容性约束与以前的Python版本被大大削弱的地方,它又变成了items)。

相关问题 更多 >