使用“for”循环遍历字典
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
Python 如何识别它只需要从
字典?键是 Python 中的一个特殊词吗?或者它只是一个
变量?
不仅仅是for 循环。这里重要的词是“迭代”。
字典是键到值的映射:
d = {'x': 1, 'y': 2, 'z': 3}
任何时候我们迭代它,我们都会迭代键。变量名称key 仅用于描述性 - 它非常适合此目的。
这发生在列表推导中:
>>> [k for k in d]
['x', 'y', 'z']
当我们将字典传递给列表(或任何其他集合类型对象)时会发生这种情况:
>>> list(d)
['x', 'y', 'z']
Python 迭代的方式是,在需要的上下文中,它调用对象(在本例中为字典)的 __iter__ 方法,该方法返回一个迭代器(在本例中为 keyiterator 对象):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
我们自己不应该使用这些特殊方法,而是使用各自的内置函数来调用它,iter:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
迭代器有一个 __next__ 方法 - 但我们使用内置函数 next 调用它:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
当迭代器耗尽时,它会引发StopIteration。这就是 Python 知道退出 for 循环、列表推导、生成器表达式或任何其他迭代上下文的方式。一旦迭代器引发StopIteration,它就会一直引发它——如果你想再次迭代,你需要一个新的。
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
返回字典
我们已经看到 dicts 在许多情况下进行迭代。我们所看到的是,任何时候我们遍历一个字典,我们都会得到密钥。回到原来的例子:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
如果我们更改变量名,我们仍然会得到键。让我们试试吧:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
如果我们想遍历这些值,我们需要使用 dicts 的.values 方法,或者两者一起使用,.items:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
在给出的示例中,像这样遍历项目会更有效:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
但出于学术目的,这个问题的例子很好。