我在互联网上找到了以下代码并尝试理解它。
我不知道如果在循环中稍后赋值,我们如何使用值。
如果有人可以解释它是如何工作的,即每次迭代都分配回来,那么还要进一步理解
>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))
答案 0 :(得分:10)
您正在查看generator expression。 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 comprehension:
ds = {chr(i): range(i, i+5) for i in range(65,70)}
结果会是一样的;你定义key: value
表达式来从循环中构建字典。
在生成器表达式以及(list,dict或set)理解中,您可以使用多个嵌套循环,并添加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)
请参阅this article进行快速介绍。
答案 1 :(得分:2)
它使用generator expression来创建元组的迭代器,然后将其传递给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'}