2013-06-09 11 views
51

は、行列を転置Pythonでこの機能を書きました。シングルライン入れ子になったためにループが

  1. forループの実行順序はどのようなものですか?
  2. トリプルネストループの場合、どのような順序で実行されますか?
  3. 等しくないループと等しいでしょうか?
  4. 考える

[ function(i,j) for i,j in object ] 
  1. どのような種類のループ構造のためにこれを使用するために対象物なければなりませんか?
  2. オブジェクトの要素にiとjを割り当てる順序は何ですか?
  3. 別のforループ構造でシミュレートできますか?
  4. このforループは、ループのための類似の構造または異なる構造でネストできますか?そしてそれはどのように見えるでしょうか?

追加情報も高く評価されます。

答えて

91

最高の情報源はofficial Python tutorial on list comprehensionsです。リスト内包はforループとほとんど同じです(確かにリスト内包はforループとして書くことができます)が、forループを使用するよりもしばしば高速です。

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] 
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] 

チュートリアルからこの長いリストの内包を見てみると、(if部分は、ここではリスト内包((x,y))の最後の部分に渡され、if文を渡し、部品のみ理解をフィルタリングこれは、forループのネストされたこのとまったく同じです(チュートリアルが言うようにする方法についての順、注意してください、とと同じ場合)。

>>> combs = [] 
>>> for x in [1,2,3]: 
...  for y in [3,1,4]: 
...   if x != y: 
...    combs.append((x, y)) 
... 
>>> combs 
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] 

主要違いは、リストの理解とforループの間に、forループの最後の部分(何かを行う場所)が最後ではなく最初に来るということです。ご質問には

どのような種類のループ構造のためにこれを使用するために対象物なければなりませんか?

iterable。要素の(有限の)集合を生成することができる任意のオブジェクト。

オブジェクトの要素にiとjを割り当てる順序はどのようなものですか?

これらは、ネストされたforループのように、各リストから生成されたものと全く同じ順序で割り当てられます(最初の理解では、iの要素を1つ、jのすべての値、2番目の要素をi、jのすべての値など)

別のforループ構造でシミュレートできますか?

はい、上記のとおりです。

このforループは、ループのための類似の構造または異なる構造でネストできますか?そしてそれはどのように見えるでしょうか?

確かに、それは素晴らしい考えではありません。ここでは、例えば、あなたの文字のリストのリストを与える:すべての

[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")] 
+0

となります。ダブルネストでは、どのような順序付けを選択したのでしょうか。私は他のやり方が自然であることを見いだしています(あなたの例ではyの場合はxです)。私は、Pythonを(広範囲ではありませんがまだ... ...)やそのようなループを使用して3年後に実現しました! – Thomas

+1

よく言って、ありがとう! –

3

まず、あなたの最初のコードは、それ自体がforループを使用しますが、list comprehensionしません。

  1. は、範囲(0、幅)にjについて

    と等価になります:範囲(0、高さ)におけるiに対する : M [I] [J]

  2. 多く同じように、一般的にはループのように、右から左にネストします。しかし、リストの理解の構文はより複雑です。

  3. 私はこの質問は(何一口


  1. 正確に2つのオブジェクトをもたらす反復可能なオブジェクトを生成する任意の反復可能オブジェクトを求めているかわからないんだけど - すなわち[(1,2),'ab']が有効になります)

  2. 反復処理でオブジェクトが生成される順序。 iは第1の収率に、jは第2の収率になる。

  3. はい、しかしそれほど美しくはありません。

     
    l = list() 
    for i,j in object: 
        l.append(function(i,j)) 
    

    またはより良いmapを使用します:私はそれが機能的に同等であると考えてい

    map(function, object) 
    

    しかし、もちろん機能のij自身を取得する必要があります。

  4. これは3と同じ質問ではありませんか?

20

あなたはそれを渡すすべてのイテレート可能オブジェクトから値の反復可能な降伏タプルを返しitertools.product、に興味があるかもしれません。すなわち、itertools.product(A, B)は、(a, b)の形式のすべての値をもたらし、aの値はAであり、bの値はBになります。

import itertools 

A = [50, 60, 70] 
B = [0.1, 0.2, 0.3, 0.4] 

print [a + b for a, b in itertools.product(A, B)] 

この版画:たとえば、最後の引数はitertools.productに渡す方法

[50.1, 50.2, 50.3, 50.4, 60.1, 60.2, 60.3, 60.4, 70.1, 70.2, 70.3, 70.4] 

通知は "内側" です。一般的には、itertools.product(a0, a1, ... an)[(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]

関連する問題