2016-06-27 29 views
1

私は基本的にこの基本的なコードでリストの理解度を使用して頭を上げようとしています。イムは、リスト項目の値によって、リスト項目を複製しようとしている:リストの項目をリスト内包で複数回複製する

y = [1, 2, 0, 1] 
x = [] 
for i in y: 
    for j in range(i): 
     x.append(i) 
# Desired output 
>>> [1, 2, 2, 1] 

x = [i for _ in range(i) for i in y] 
# Wrong output 
>>> [1, 2, 0, 1] 

# Right output 
x = [j for j in y for _ in range(j)] 
>>> [1, 2, 2, 1] 

私はちょうど私が第二の例のために間違った出力を得る理由のまわりで私の頭を取得するように見える傾けます。誰かがここで何が間違っているのか説明できますか?ありがとう。

+0

あなたの最初の理解は、実行中にエラーを出します(つまり、 'name 'i'が定義されていません)。ネストされたリスト内包表記では、ループは外側から移動します。 – Rahul

+1

@Rahul前の行の 'for'ループが' i'の値をリークするため、このエラーは発生しません。 – Selcuk

+1

http://stackoverflow.com/a/17657966/4014959 –

答えて

3

に触発されたリストの範囲(項目)回
内の項目のためにあなたがしたい
項目を結果を与えますリスト内に複数のループがある場合、l oopsは "従来の" forループを使用するのと同じ順序で処理されます。正しい出力を与えるリストのcompは、最初のコードと同じ順序のループを持っていて、の従来のforループを使用しています。

ラーフルはコメントで述べたように、単独で、

x = [i for _ in range(i) for i in y] 

iが先コードによって定義されたので、この場合にない

NameError: name 'i' is not defined 

を与えるだろう。これとは対照的に


、ネストされたリストのcompと何が起こるかを見てみましょう。ここでは

[[0], [0, 1], [], [0]] 

y = [1, 2, 0, 1] 
x = [[j for j in range(i)] for i in y] 
print(x)  

出力は、最も外側のループは、外側と内側の理解でありますループは内部の理解にある。したがって、for i in yの各反復に対して、新しいリストのコンプを作成し、そのリストのコンプにループrange(i)をループします。

1

右の理解は次のとおりです。

x = [i for i in y for j in range(i)] 

この本thread

flattened = [val for sublist in list_of_lists for val in sublist] 
-1
x = [j for j in y for i in range(j)] 
+1

このコードは、 'y'を再利用するので少し混乱します。また、あなたのコードにいくつかの説明を追加することは、常により良い方法です。説明のないコードのみの回答は、有用性には限りがあります。 –

+0

ありがとう@PM 2Ring、コードが修正されました –

関連する問題