1. ホーム
  2. python

[解決済み] 1行の入れ子型Forループ

2022-08-11 02:46:27

質問

Pythonで行列の転置を行う関数を書きました。

def transpose(m):
    height = len(m)
    width = len(m[0])
    return [ [ m[i][j] for i in range(0, height) ] for j in range(0, width) ]

この過程で、一行でネストされたforループがどのように実行されるかを完全に理解していないことに気づきました。以下の質問に答えることで、私が理解するのを助けてください。

  1. この for ループが実行される順序は何ですか。
  2. 3重にネストされたforループがあった場合、どのような順序で実行されるでしょうか?
  3. 等しい非ネスト化されたforループは何になるのでしょうか?

与えられた。

[ function(i,j) for i,j in object ]

  1. このfor loop構造を使用するために、objectはどのような型でなければなりませんか?
  2. objectの要素に割り当てられるiとjの順序は?
  3. 別のforループ構造でシミュレートできますか?
  4. この for ループは、類似または異なる構造の for ループとネストできますか? また、それはどのように見えるでしょうか?

追加情報もお願いします。

どのように解決するのですか?

情報源として最適なのは リスト内包に関する公式の Python チュートリアル . リスト内包は for ループとほぼ同じですが(確かにどんなリスト内包も for ループとして書くことができます)、for ループを使うより速いことがよくあります。

チュートリアルにあるこの長いリスト内包を見てください ( if の部分は内包をフィルタリングし、if 文を通過した部分のみがリスト内包の最後の部分に渡されます (ここでは (x,y) ):

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

このネストされたforループと全く同じです(チュートリアルが言うように、forとifの順序が同じであることに注意してください)。

>>> 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ループの最後の部分(何かをする部分)が最後ではなく、最初に来るということです。

ご質問にお答えします。

このfor loop構造を使用するためには、オブジェクトはどのような型でなければならないのでしょうか?

ある イテラブル . 要素の(有限の)セットを生成できるあらゆるオブジェクト。これには、任意のコンテナ、リスト、セット、ジェネレータなどが含まれます。

iとjがオブジェクトの要素に割り当てられる順序は何ですか?

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

別のforループ構造でシミュレートできるのでしょうか?

はい、上記ですでに示されています。

<ブロッククオート

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

もちろんですが、あまりいいアイデアではありません。ここでは、例えば、文字のリストのリストを与えています。

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