为什么在迭代python中的字典时必须调用.iteritems()?

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了).

  • 非常明确的解释.我想我需要再去看一下python的'引擎盖'.`in`和`for x in`运算符如何工作对我来说仍然有点神奇. (2认同)
  • @Falmarri,当然,如果您选择询问的话,我也可以讨论事物的C级别! - ) (2认同)

Joh*_*ica 9

我的猜测:使用完整的元组对于循环来说会更直观,但对于使用的成员资格测试来说可能更少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__).但是这种微小的不一致会让人感到困惑,而且不一致.