使用'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()之后发生的字典更改。 如果你想在3.x中使用2.x行为,你可以调用list(d.items())


这不是关键词,而是字典实现迭代器协议。 你可以在你的类中做到这一点,例如,看看这个问题如何构建类迭代器。

在字典的情况下,它在C级实施。 细节可在PEP 234中找到。特别是,标题为“字典迭代器”的部分:

  • 字典实现一个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))
    
    链接地址: http://www.djcxy.com/p/795.html

    上一篇: Iterating over dictionaries using 'for' loops

    下一篇: Is there an equivalent of 'which' on the Windows command line?