使用.iteritems()迭代Python字典中的键值

Adj*_*con 9 python dictionary python-2.7

注意:我已阅读此帖和Alex Martelli的回复,但我并不完全/完全理解他的回答.这有点超出了我目前的理解.我想帮助更好地理解它.

我理解当您尝试以下for循环时:

for key, value in dict:
    print key
    print value 
Run Code Online (Sandbox Code Playgroud)

你得到:

ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

虽然您可以循环遍历字典,但只需使用以下内容获取密钥:

for key in dict:
    print key 
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供一个稍微不那么高级的解释,为什么你不能使用键值,而不使用.iteritems()?来迭代字典?

Ste*_*ann 11

另一个答案解释得很好.但是这里有一些关于它如何表现的进一步说明,通过显示它实际上没有错误的情况(所以你可以看到一些东西):

>>> d = {(1,2): 3, (4,5): 6}
>>> for k, v in d:
        print k, v

1 2
4 5
Run Code Online (Sandbox Code Playgroud)

循环遍历键(1,2),(4,5)并且因为那些"碰巧是"大小为2的元组,它们可以被分配给kv.

也可以使用字符串,只要它们只有两个字符:

>>> d = {"AB":3, "CD":6}
>>> for k, v in d:
        print k, v

A B
C D
Run Code Online (Sandbox Code Playgroud)

我假设你的情况是这样的?

>>> d = {"ABC":3, "CD":6}
>>> for k, v in d:
        print k, v

Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    for k, v in d:
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

这里,键"ABC"是三元组,因此Python抱怨尝试将其解压缩为两个变量.

  • 我希望通过一些示例来说明行为是有帮助的,特别是实际上会导致收到的`ValueError`.我为此添加了更多答案...... (2认同)

use*_*ica 8

Python有一个名为iterable unpacking的功能.当你这样做

a, b = thing
Run Code Online (Sandbox Code Playgroud)

Python假设thing是一个元组或列表或具有2个项目的东西,它将第一个和第二个项目分配给ab.这也适用于for循环:

for a, b in thing:
Run Code Online (Sandbox Code Playgroud)

相当于

for c in thing:
    a, b = c
Run Code Online (Sandbox Code Playgroud)

除了它不创建该c变量.

这意味着,如果你这样做

for k, v in d:
Run Code Online (Sandbox Code Playgroud)

Python无法看到你说过的事实,k, v而不是k给你项而不是键,因为键可能是2元组.它必须遍历键并尝试将每个键解包到kv变量中.