我正在爲我的考試做準備,並決定開始解決過去的考試。其中一個要求是瞭解代碼的功能。但是我對這個註釋有麻煩。瞭解嵌套列表解析的評估順序
我不明白這個嵌套循環的結構和首先執行哪個循環。
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
把它們寫成常規循環,你就可以很容易地找出它。 –