2016-08-16 94 views
1

我正在为我的考试做准备,并决定开始解决过去的考试。其中一个要求是了解代码的功能。但是我对这个注释有麻烦。了解嵌套列表解析的评估顺序

我不明白这个嵌套循环的结构和首先执行哪个循环。

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) 

有人可以帮我理解吗?

+1

请问[此问题](http://stackoverflow.com/questions/18072759/python-nested-list-comprehension)有帮助吗? – Pureferret

+0

把它们写成常规循环,你就可以很容易地找出它。 –

回答

1

它开始通过评估:

[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))降低到与被用作ifor 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]  
+0

好吧我现在明白了cristal!非常感谢谢谢 – Nancy

0

作为一个经验法则,最里面的环将首先执行。

有考虑到这一点,让我们打破这个问题藏:

[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

-1

我会给你一个小秘密,这将有助于你肯定的,如果你有一个很难理解内部循环,运行以下代码:

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 

一旦你了解这个理解代码列表成为你的第二天性,然后就回到你原来的代码,你不会有任何问题,它:)

0

这等同于:

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