我在 Internet 上找到了以下代码并试图理解它。
不知道我们如何在循环中稍后为 i 赋值时使用 value 。
如果有人能解释它是如何工作的,也就是为每次迭代分配回
>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))
我在 Internet 上找到了以下代码并试图理解它。
不知道我们如何在循环中稍后为 i 赋值时使用 value 。
如果有人能解释它是如何工作的,也就是为每次迭代分配回
>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))
您正在查看生成器表达式。之前的部分在表达式for
定义的循环中执行。for
生成器表达式生成一系列key, value
对,dict()
构造函数使用它来构建字典。您可以将代码阅读为具有与以下相同的结果:
ds = {}
for i in range(65, 70):
ds[chr(i)], range(i, i+5)
在 Python 2.7 和 Python 3 中,您也可以使用dict 推导:
ds = {chr(i): range(i, i+5) for i in range(65,70)}
结果是一样的;您定义key: value
表达式以从循环中构建字典。
在生成器表达式以及(列表、字典或集合)推导中,您可以使用多个嵌套循环,并添加if
语句来过滤数据。这些是按嵌套顺序定义的;首先是最外层循环:
result = [i ** 2 for foo in range(10) if foo % 2 == 0 for i in range(foo)]
可以读作:
result = []
for foo in range(10):
if foo % 2 == 0:
for i in range(foo):
result.append(i ** 2)
请参阅本文以快速入门。
它使用生成器表达式创建元组的迭代器,然后将其传递给dict
构造函数以构建新字典。如果您通过将生成器转换为列表来查看生成器正在做什么,它会有所帮助:
>>> list((chr(i), range(i, i+5)) for i in range(65,70))
[('A', [65, 66, 67, 68, 69]), ('B', [66, 67, 68, 69, 70]), ('C', [67, 68, 69, 70, 71]), ('D', [68, 69, 70, 71, 72]), ('E', [69, 70, 71, 72, 73])]
请记住,如果您传递dict
一个元组列表,每个元组的第一个元素将用作键,第二个元素将用作值:
>>> dict([('key1', 'val1'), ('key2', 'val2')])
{'key2': 'val2', 'key1': 'val1'}