web-dev-qa-db-ja.com

Pythonのforループで複数の変数を使用する

Pythonでさまざまなデータ型に対してforがどのようにループするかをより深く理解しようとしています。 forループを使用して配列を反復する最も簡単な方法は、次のとおりです。

for i in range(len(array)):
    do_something(array[i])

私もできることを知っています

for i in array:
    do_something(i)

私が知りたいのはこれが何をするかです

for i, j in range(len(array)):
    # What is i and j here?

または

for i, j in array:
    # What is i and j in this case?

そして、dictionariesまたはtuplesでこれと同じアイデアを使用するとどうなりますか?

3
Ely Fialkoff

最も簡単で最良の方法は、最初の方法ではなく2番目の方法です。

for i in array:
    do_something(i)

これを行わないでください。コードを不必要に複雑にします。

for i in range(len(array)):
    do_something(array[i])

何らかの理由で配列のインデックスが必要な場合(通常は不要)、代わりに次のようにします。

for i, element in enumerate(array):
    print("working with index", i)
    do_something(element)

これは単なるエラーです。TypeError: 'int' object is not iterable 1つの整数を2つの名前にアンパックしようとする場合:

for i, j in range(len(array)):
    # What is i and j here?

これはうまくいくかもしれません、配列が「二次元」であると仮定します:

for i, j in array:
    # What is i and j in this case?

2次元配列の例は、ペアのリストです。

>>> for i, j in [(0, 1), ('a', 'b')]:
...     print('i:', i, 'j:', j)
...     
i: 0 j: 1
i: a j: b

注:['these', 'structures']は、Pythonでは配列ではなくリストと呼ばれます。

7
wim

3番目のループは、TypeErrorintではない場合にiterableをスローするため、機能しません。これは、unpack、およびiへの配列のインデックスであるintを "j"にしようとしているためです。これは不可能です。解凍の例は次のとおりです。

tup = (1,2)
a,b = tup

ここで、aTupleの最初の値に割り当て、bを2番目の値に割り当てます。これは、functionが値のタプルを返し、関数を呼び出すときにすぐにアンパックする場合にも役立ちます。お気に入り、

train_X, train_Y, validate_X, validate_Y = make_data(data)

あなたが参照していると私が思うより一般的なループのケースは、配列の項目とそのインデックスを反復する方法です。

for i, e in enumerate(array):
    ...

そして

for k,v in d.items():  
    ...

dictionaryの項目を反復するとき。さらに、2つのリストがある場合、l1およびl2このように両方のコンテンツを反復できます

for e1, e2 in Zip(l1,l2):
    ...

反復中に長さが等しくない場合、これにより長いリストが切り捨てられることに注意してください。または、外部リストの長さがmで内部がnであるリストのリストがあり、インデックスでグループ化された内部リットの要素を反復処理するとします。これはマトリックスの転置を効果的に繰り返します。Zipを使用してこの操作を実行することもできます。

for inner_joined in Zip(*matrix):  # will run m times
    # len(inner_joined) == m
    ...
2
modesitt

実際には、「配列を反復するforループを使用する最も簡単な方法」(Pythonタイプは「リスト」という名前のBTW)が2番目のものです。つまり、

_for item in somelist:
    do_something_with(item)
_

どのFWIWがすべてのイテラブル(リスト、タプル、セット、ディクテーション、イテレーター、ジェネレーターなど)に対して機能します。

範囲ベースのCスタイルバージョンは、高度に非Pythonicと見なされ、リストまたはリストのようなイテラブルでのみ機能します。

私が知りたいのはこれが何をするかです

_for i, j in range(len(array)):
    # What is i and j here?
_

さて、あなたは自分でそれをテストすることができます...しかし、結果は明白です:解凍は反復可能オブジェクトでのみ機能し、intは反復不可能であるため、TypeErrorが発生します。

または

_for i, j in array:
    # What is i and j in this case?
_

arrayが何であるか、およびそれを反復したときに何が生成されるかに依存します。 2タプルのリストまたは2タプルを生成するイテレータの場合、iおよびjは現在の反復項目の要素になります。つまり、

_array = [(letter, ord(letter)) for letter in "abcdef"]
for letter, letter_ord in array:
    print("{} : {}".format(letter, letter_ord))
_

そうでなければ、おそらくTypeErrorも発生させます。

アイテムとインデックスの両方が必要な場合、解決策は組み込みのenumerate(sequence)であり、アイテムごとに_(index, item)_タプルが生成されます。

_array = list("abcdef")
for index, letter in enumerate(array):
    print("{} : {}".format(index, letter)
_
0