2016-08-16 12 views
1

私は私の試験の準備をしており、過去の試験を開始することに決めました。要件の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

[this](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)] 

まで沸騰する:range(2, int(n * 0.5))for r in range(i * 2, n, i)iの値として使用される単一要素[2]でリストに低減するため

[r for r in range(4, 10, 2)] 

ステートメント。したがって、内部リストの理解度は[4, 6, 8]と評価されます。

そして、アウターループfor q in range(2, n)が実行され、それは以前に構築リスト、すなわち[4, 6, 8]と属していないリスト[2, 3, ..., 9]からこれらの要素を返し:経験則として

# range(2, n) -> [2, 3, ..., 9] 
q for q in range(2, n) if q not in [..previously constructed list]  
+0

申し分なく、私は今クリスタルクリアを得る!ありがとう – 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(以上の情報のためrangeを参照)範囲(2、3)であり、 。

したがって、iは2になるでしょう。

p = [q for q in range(2, n) if q not in [4, 6, 8]] 

r in range(i * 2, n, i)は、可能な値は4、6および8

ある問題となる2のステップを使用して、ここで、Rは(除外)4〜10であろう非常に単純に見えます

基本的には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