我对以下代码感到有点困惑:
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 dict
中for 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)]
这为您提供了元组列表。当你像这样循环它们时,每个元组都自动解压缩为k
和v
:
for k,v in d.items():
print(k, 'corresponds to', v)
如果循环的主体只有几行,则在循环dict
时使用k
和v
作为变量名是很常见的。对于更复杂的循环,使用更具描述性的名称可能是个好主意:
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))