2012-01-16 42 views
0

我只是用列表推導玩,碰到這樣的:這個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

請解釋這是如何工作的?

+1

'h = [b for b in range(1,9)]'會給你你的預期結果。你認爲所有其他的東西在做什麼? – Ben 2012-01-16 05:00:30

+0

我只是試驗,然後我用b代替j。但結果出乎意料之外。 – 2012-01-16 05:02:19

+0

'[b for range in(1,9)] ==範圍(1,9)'in python 2.x – wim 2012-01-16 05:02:45

回答

4

您爲什麼認爲這是預期的結果?

您的代碼就相當於:

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 
+0

你明白了,它就像一個棘手的語法令我困惑。謝謝 :) – 2012-01-16 05:05:33

4

你的列表比較是相同的:

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) 

所以可能它只是你的循環嵌套列表理解的順序的理解是錯誤的。

按照它們在理解中出現的順序展開循環(或完全避免三重嵌套理解 - 它們有變得不可理解的習慣!)。