协慌网

登录 贡献 社区

使用'for' 循环迭代字典

我对以下代码感到有点困惑:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

我不明白的是key部分。 Python 如何识别它只需要从字典中读取密钥? key是 Python 中的一个特殊词吗?或者它只是一个变量?

答案

key只是一个变量名。

for key in d:

将简单地循环遍历字典中的键,而不是键和值。要循环键和值,您可以使用以下内容:

对于 Python 2.x:

for key, value in d.iteritems():

对于 Python 3.x:

for key, value in d.items():

要自己测试,请将单词key更改为poop

对于 Python 3.x, iteritems()已被简单的items()替换,它返回由 dict 支持的类似集合的视图,如iteritems()但更好。这也可以在 2.7 中作为viewitems()

操作items()将适用于 2 和 3,但是在 2 中它将返回字典(key, value)对的列表,这不会反映在items()调用之后发生的对 dict 的更改。如果你想要 3.x 中的 2.x 行为,你可以调用list(d.items())

并不是密钥是一个特殊的单词,而是字典实现了迭代器协议。您可以在您的类中执行此操作,例如,请参阅此问题以了解如何构建类迭代器。

在字典的情况下,它是在 C 级实现的。有关详细信息,请参阅PEP 234 。特别是标题为 “Dictionary Iterators” 的部分:

  • 字典实现了一个 tp_iter 槽,它返回一个有效的迭代器,迭代字典的键。 [...] 这意味着我们可以写

    for k in dict: ...

    这相当于,但比快得多

    for k in dict.keys(): ...

    只要不违反对字典的修改(通过循环或其他线程)的限制。

  • 向显示返回不同类型迭代器的字典添加方法:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...

    这意味着for x in dictfor x in dict.iterkeys()

dict迭代不按特定顺序迭代其键,如下所示:

编辑:( Python3.6 中不再是这种情况 ,但请注意,它还不能保证行为)

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

对于您的示例,使用dict.items()更好一点:

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

这为您提供了元组列表。当你像这样循环它们时,每个元组都自动解压缩为kv

for k,v in d.items():
    print(k, 'corresponds to', v)

如果循环的主体只有几行,则在循环dict时使用kv作为变量名是很常见的。对于更复杂的循环,使用更具描述性的名称可能是个好主意:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

养成使用格式字符串的习惯是个好主意:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))