2016-05-23 8 views
2

私はかなり、私はそれが何を知っているにもかかわらず、がどのように以下の理解を読むことを理解していない:2つの式でPythonの理解を読むには?

>>> matrix=[[1,2,3],[4,5,6],[7,8,9]] 
>>> [x for row in matrix for x in row] 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 

だから、どのようにこの理解は、自然言語に翻訳するのでしょうか?私はこの式を2つの部分、つまりx for row in matrixfor x in rowに分割しようとすると、それらがすべてタスクのコンテキストで非感覚になるため、わかりません。

答えて

5

だけforの間に新しい行を追加し、ループのためにそれらを定期的に行います。

for row in matrix: 
    for x in row: 
     print x 

順序は、ネストされたループは、外書きしなければならないとして、そのような定期的なループの順序のようなものです。

[x for row in matrix for x in row for t in x] 
    (level 1) ---> (level 2) ---> (level 3) 
      ---> nested loops 
+0

を好むだろうかHm。ありがとう!今それは理にかなっています。 – Jacobian

+1

私はすべての回答を受け入れることができますが、あなたの答えは最初に2Dケースを扱ったものでした。この説明をありがとう! – Jacobian

+0

しかし、彼らはなぜこのようにしましたか?私は最後の3-4年の間、Pythonをたくさん使ってきました。そして、私はまだリストの理解の中で複数の 'for''saをやや混乱させ、通常は'チェーン '(\ flattern)のネストされたリスト内包を書いています。やや明示的なので、「外から内に」実行されているかのように読むことができます(関数の構成のように他のほとんどの機能と同じように)。 –

3

リストの内包を読むための最良の方法は、ループのために、逆の順序として、それらを読むことです:2Dのリストについては

>>> new_list=[] 
>>> for i in l: 
... new_list+=[i*2] 
... 
>>> print(new_list) 
[2, 4, 6, 8] 

>>> matrix=[[1, 2, 3], [4, 5, 6]] 
>>> [col for row in matrix for col in row] 
[1, 2, 3, 4, 5, 6] 

>>> l=[1, 2, 3, 4] 
>>> [i*2 for i in l] 
[2, 4, 6, 8] 

に相当します

は、

と同等です。
>>> new_list=[] 
>>> for row in matrix: 
...  for col in row: 
...   new_list+=[col] 
... 
>>> print(new_list) 
[1, 2, 3, 4, 5, 6] 
+0

あなたのソリューションは、きちんとしていると私は1 –

2

これは2レベルの深さのループであることを示しています(for)。あなたはそれを打破する場合:

[ x | for row in matrix | for x in row ] 

をあなたが参照してくださいよ、左端の部分が最も内側の表現、残りはネストされたループです:

result = [] 
for row in matrix: 
    for x in row: 
     result.append(x) 
関連する問題