我在互联网上找到了下面的代码并试图理解它。如何阅读此代码
不知道我们如何在循环中稍后分配值时使用i值。
还进一步感激,如果有人能解释一下它的工作原理是如何分配的,即回每次迭代
>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))
我在互联网上找到了下面的代码并试图理解它。如何阅读此代码
不知道我们如何在循环中稍后分配值时使用i值。
还进一步感激,如果有人能解释一下它的工作原理是如何分配的,即回每次迭代
>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))
你正在寻找一个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)
一个快速intoduction见this article。
它使用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'}
它应该更好,因为我在范围内(65,70)}''ds = {chr(i):range(i,i + 5)。为什么要创建一个生成器然后字典,当你可以直接创建一个字典? – Billiska
@Billiska:因为直到Python 2.7才引入dict comprehensions。 – Blender
'pprint'在这里并不重要。 – Elazar