2016-08-16 96 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