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?
そして、dict
ionariesまたはtuples
でこれと同じアイデアを使用するとどうなりますか?
最も簡単で最良の方法は、最初の方法ではなく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では配列ではなくリストと呼ばれます。
3番目のループは、TypeError
がint
ではない場合にiterable
をスローするため、機能しません。これは、unpack
、およびi
への配列のインデックスであるintを "j
"にしようとしているためです。これは不可能です。解凍の例は次のとおりです。
tup = (1,2)
a,b = tup
ここで、a
をTuple
の最初の値に割り当て、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
...
実際には、「配列を反復する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)
_