2012-01-16 5 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は範囲(1,9)に]'あなたの期待した結果を与えるでしょう。他のすべてのものは何をしていると思いますか? – Ben

+0

私はちょうど実験していました、そして、私はjの代わりにbを使いました。しかし、その結果は予期せぬものとなった。 –

+0

'python 2.xで[bの範囲(1,9)] ==範囲(1、9)'で – wim

答えて

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

あなたはそれのようなトリッキーな構文それは私を混乱させた。ありがとう:) –

4

あなたのリストのcompがこれに相当します

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) 

だから、おそらくそれは、ネストされたリストの内包のループのためのあなたの理解が間違っていただけです。

ループを精通している順番にループを精密に展開します(または、トリプルネストされた理解を完全に避ける - 理解できなくなる癖があります)。

関連する問題