Fal*_*rri 130 python dictionary loops
为什么必须调用iteritems()迭代字典中的键值对?即
dic = {'one':'1', 'two':'2'}
for k, v in dic.iteritems():
print k, v
Run Code Online (Sandbox Code Playgroud)
为什么不是迭代字典的默认行为
for k, v in dic:
print k, v
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 170
对于每个python容器C,期望是这样的
for item in C:
assert item in C
Run Code Online (Sandbox Code Playgroud)
如果一个(循环子句)的含义与另一个(存在性检查)具有完全不同的含义,你会不会觉得它很惊人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
Run Code Online (Sandbox Code Playgroud)
有价值也没有特别帮助:
for k, v in thedict.items():
thedict[k] = v + 1
Run Code Online (Sandbox Code Playgroud)
实际上有点不那么清晰,不那么简洁.(请注意,这items是用于获取键/值对的"正确"方法的原始拼写:不幸的是,这些访问者返回整个列表的时候,所以为了支持"只是迭代",必须引入替代拼写,iteritems 它是 - 在Python 3中,与以前的Python版本的向后兼容性约束被大大削弱,它又变成items了).
我的猜测:使用完整的元组对于循环来说会更直观,但对于使用的成员资格测试来说可能更少in.
if key in counts:
counts[key] += 1
else:
counts[key] = 1
Run Code Online (Sandbox Code Playgroud)
如果您必须同时指定键和值,那么该代码将无法正常工作in.我很难想象用例,你要检查关键的AND值是否都在字典中.仅测试键是更自然的.
# When would you ever write a condition like this?
if (key, value) in dict:
Run Code Online (Sandbox Code Playgroud)
现在,in操作员无需for ... in操作相同的物品.实施方面,他们是不同的运营(__contains__对比__iter__).但是这种微小的不一致会让人感到困惑,而且不一致.
| 归档时间: |
|
| 查看次数: |
82442 次 |
| 最近记录: |