我正在为我的考试做准备,并决定开始解决过去的考试。其中一个要求是了解代码的功能。但是我对这个注释有麻烦。了解嵌套列表解析的评估顺序
我不明白这个嵌套循环的结构和首先执行哪个循环。
n = 10
p = [q for q in range(2, n) if q not in [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]]
print(p)
有人可以帮我理解吗?
我正在为我的考试做准备,并决定开始解决过去的考试。其中一个要求是了解代码的功能。但是我对这个注释有麻烦。了解嵌套列表解析的评估顺序
我不明白这个嵌套循环的结构和首先执行哪个循环。
n = 10
p = [q for q in range(2, n) if q not in [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]]
print(p)
有人可以帮我理解吗?
它开始通过评估:
[r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]
其归结为:
[r for r in range(4, 10, 2)]
因为range(2, int(n * 0.5))
降低到与被用作i
在for r in range(i * 2, n, i)
值的单个元件[2]
列表声明。所以内部列表理解评估为[4, 6, 8]
。
然后,外环for q in range(2, n)
被执行并返回从列表[2, 3, ..., 9]
那些元素中不先前构造的列表属于即[4, 6, 8]
用:
# range(2, n) -> [2, 3, ..., 9]
q for q in range(2, n) if q not in [..previously constructed list]
好吧我现在明白了cristal!非常感谢谢谢 – Nancy
作为一个经验法则,最里面的环将首先执行。
有考虑到这一点,让我们打破这个问题藏:
[r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]
n**0.5
是3.xxx,所以range(2, int(n**0.5))
实际上是在范围(2,3),这是2(参见range更多信息) 。因此i
将是2,不管怎么样。
r in range(i * 2, n, i)
现在看起来非常简单,R将是4和10(不包括)之间,使用为2的步骤可能的值是4,6和8
问题变得:
p = [q for q in range(2, n) if q not in [4, 6, 8]]
在2和10(不含)之间基本上所有的奇数,加数字2
我会给你一个小秘密,这将有助于你肯定的,如果你有一个很难理解内部循环,运行以下代码:
resultA = []
for x in ['x1', 'x2', 'x3']:
for y in ['y1', 'y2', 'y3']:
for z in ['z1', 'z2', 'z3']:
resultA.append(''.join([x, y, z]))
print resultA
resultB = [''.join([x, y, z])
for x in ['x1', 'x2', 'x3']
for y in ['y1', 'y2', 'y3']
for z in ['z1', 'z2', 'z3']
]
print resultB
print resultA == resultB
一旦你了解这个理解代码列表成为你的第二天性,然后就回到你原来的代码,你不会有任何问题,它:)
这等同于:
list_i=[]
for i in range(2, int(n**0.5)):
for r in range(i*2, n, i):
list_i.append(r)
res=[]
for q in range(2, n) :
if q not in list_i:
res.append(q)
print res
请问[此问题](http://stackoverflow.com/questions/18072759/python-nested-list-comprehension)有帮助吗? – Pureferret
把它们写成常规循环,你就可以很容易地找出它。 –