2016-11-07 15 views
0

次のリストの理解をPythonのforループ文に変換するにはどうすればよいですか?例えばこのリストの理解をforループに変換するにはどうすればよいですか?

p = [[S[x] for x in range(len(S)) if i>>x&1] for i in range(2**len(S))] 

S = [0,1]、それは出力[[], [0], [1], [0,1]]をする必要があります。

私は多分、次のようなことを考えたが、私は間違っていた:

p=[] 
for x in range(len(S)): 
    for i in range(2**len(S)): 
     if i>>x&1: 
      p.append([S[x]]) 
+0

*「私は間違っていました」*入力と出力、例えば? 1つの明白な問題は、オリジナルでネストされたリストが作成され、新しいバージョンではそうではないということです。 – jonrsharpe

+0

ああ、あなたのアドバイスとすべてのあなたの助けを感謝します! –

答えて

2

あなたは、ネストされたリストの内包を持っています。外側のリストの理解は、一連のリストを生成し、それぞれは別のリストの理解によって生成されます。

これは次いでpに追加されていることを、内側ループは、リストを生成するネストされたループに変換:

p = [] 
for i in range(2 ** len(S)): 
    inner = [] 
    for x in range(len(S)): 
     if i >> x & 1: 
      inner.append(S[x]) 
    p.append(inner) 

デモ:

>>> S = [0, 1] 
>>> p = [] 
>>> for i in range(2 ** len(S)): 
...  inner = [] 
...  for x in range(len(S)): 
...   if i >> x & 1: 
...    inner.append(S[x]) 
...  p.append(inner) 
... 
>>> p 
[[], [0], [1], [0, 1]] 

出力は、元の出力と一致リストの理解:

>>> [[S[x] for x in range(len(S)) if i>>x&1] for i in range(2**len(S))] 
[[], [0], [1], [0, 1]] 
+0

ありがとうございました。私は前にネストされたリストを知らなかった。 –

関連する問題