2024-05-13 13:50:47 发布
网友
为什么要调用iteritems()来遍历字典中的键和值对?工业工程
iteritems()
dic = {'one':'1', 'two':'2'} for k, v in dic.iteritems(): print k, v
为什么这不是遍历字典的默认行为
for k, v in dic: print k, v
我的猜测是:对于循环使用完整元组会更直观,但是对于使用in测试成员资格来说可能不那么直观。
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__)。但这种小小的不一致会让人有些困惑,嗯,不一致。
for ... in
__contains__
__iter__
对于每个python容器C,期望是
for item in C: assert item in C
如果一个in(loop子句)的含义与另一个(presence check)的完全不同,您会不会觉得很奇怪?我当然会!对于列表、集合、元组。。。
因此,当C是一个字典时,如果in要在for循环中生成键/值元组,那么,根据最小惊讶原则,in还必须在包含检查中将这样的元组作为其左手操作数。
C
for
那有多有用?实际上相当没用,基本上把if (key, value) in C变成if C.get(key) == value的同义词——这是我认为我可能已经执行或想要执行的一项检查,比if k in C实际意思是的少100倍,只检查键的存在,完全忽略该值。
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是用于获取键/值对的“正确”方法的原始拼写:不幸的是,那是在这样的访问器返回整个列表的时候,所以为了支持“只是迭代”,必须引入另一种拼写,而iteritems在Python 3中,在向后兼容性约束与以前的Python版本被大大削弱的地方,它又变成了items)。
items
iteritems
我的猜测是:对于循环使用完整元组会更直观,但是对于使用
in
测试成员资格来说可能不那么直观。如果必须同时为
in
指定键和值,那么该代码就不会真正工作。我很难想象这样一个用例,您可以在其中检查键和值是否都在字典中。只测试钥匙要自然得多。现在不需要
in
运算符和for ... in
对相同的项进行操作。在实现方面,它们是不同的操作(__contains__
与__iter__
)。但这种小小的不一致会让人有些困惑,嗯,不一致。对于每个python容器C,期望是
如果一个
in
(loop子句)的含义与另一个(presence check)的完全不同,您会不会觉得很奇怪?我当然会!对于列表、集合、元组。。。因此,当
C
是一个字典时,如果in
要在for
循环中生成键/值元组,那么,根据最小惊讶原则,in
还必须在包含检查中将这样的元组作为其左手操作数。那有多有用?实际上相当没用,基本上把
if (key, value) in C
变成if C.get(key) == value
的同义词——这是我认为我可能已经执行或想要执行的一项检查,比if k in C
实际意思是的少100倍,只检查键的存在,完全忽略该值。另一方面,只想在键上循环是很常见的,例如:
同样具有价值也不会特别有帮助:
实际上有点不太清楚,也不太简洁。(注意
items
是用于获取键/值对的“正确”方法的原始拼写:不幸的是,那是在这样的访问器返回整个列表的时候,所以为了支持“只是迭代”,必须引入另一种拼写,而iteritems
在Python 3中,在向后兼容性约束与以前的Python版本被大大削弱的地方,它又变成了items
)。相关问题 更多 >
编程相关推荐