我只是用列表推導玩,碰到這樣的:這個Python列表理解有什麼問題?
h = [ b for b in range(1, 9) for k in range(b, b*10) if k%2==0 for j in range(2*k, k*k)]
預期結果:未如預期
h = [1, 2, 3, 4, 5, 6, 7, 8]
實際結果,包括項目len(h) = 196000
。
請解釋這是如何工作的?
我只是用列表推導玩,碰到這樣的:這個Python列表理解有什麼問題?
h = [ b for b in range(1, 9) for k in range(b, b*10) if k%2==0 for j in range(2*k, k*k)]
預期結果:未如預期
h = [1, 2, 3, 4, 5, 6, 7, 8]
實際結果,包括項目len(h) = 196000
。
請解釋這是如何工作的?
您爲什麼認爲這是預期的結果?
您的代碼就相當於:
h = []
for b in range(1, 9):
for k in range(b, b*10):
if k%2==0:
for j in range(2*k, k*k):
h.append(b)
所以,從1〜8的數字,則多次將其追加到列表中
您還可以看到每個號碼多少次加上groupby的幫助:
>>> for i,j in itertools.groupby(h):
print(i, sum(1 for i in j))
1 80
2 960
3 3640
4 9120
5 18392
6 32472
7 52328
8 79008
你明白了,它就像一個棘手的語法令我困惑。謝謝 :) – 2012-01-16 05:05:33
你的列表比較是相同的:
h = []
for b in range(1, 9):
for k in range(b, b * 10):
if k % 2 == 0:
for j in range(2 * k, k * k):
h.append(b)
所以可能它只是你的循環嵌套列表理解的順序的理解是錯誤的。
按照它們在理解中出現的順序展開循環(或完全避免三重嵌套理解 - 它們有變得不可理解的習慣!)。
'h = [b for b in range(1,9)]'會給你你的預期結果。你認爲所有其他的東西在做什麼? – Ben 2012-01-16 05:00:30
我只是試驗,然後我用b代替j。但結果出乎意料之外。 – 2012-01-16 05:02:19
'[b for range in(1,9)] ==範圍(1,9)'in python 2.x – wim 2012-01-16 05:02:45