なぜこのコードは間違っているのですか?
for i,j in range(100),range(200,300):
print i,j
これをステートメントでテストすると、このエラーが表示されます
ValueError: アンパックする値が多すぎます
しかし、私がテストするとき
for i, j in range(2),range(2):
print i,j
すべてが正しいです!
range(2)リスト[0、1]を与えます。したがって、i, j最初のリストからフェッチされ、次に2番目のリストからフェッチされます。
したがって、ループは次のようになります。-
for i, j in [0, 1], [0, 1]:
print i, j
プリント:-
0 1
0 1
ここで、range(3)そこにある場合は失敗します。range(3)これは、で解凍できない3要素のリストを提供するためtwo loop variablesです。
したがって、次のことはできません。-
for (i, j) in [[0, 1, 2]]:
print i, j
それは失敗し、あなたが得ているエラーをあなたに与えます。
zipを使用して、両方のリストを1つに圧縮してみてください。:-
>>> for (i, j) in (zip(range(2), range(3))):
print i, j
0 0
1 1
>>>
zip22つのリストを圧縮しているので、上記の場合、リストを要素を持つタプルのリストに変換します。
>>> zip(range(2), range(3))
[(0, 0), (1, 1)]
同様に、zip3つのリストを作成すると、3要素のタプルのリストが表示されます。
range(200), range(300)見るには長すぎますが、range(2), range(3)代わりに[1]を見ることでそのケースを理解できます:
iterable = (range(2), range(3))
print(iterable)
for i, j in iterable:
print(repr(i))
ファーストプリント
([0, 1], [0, 1, 2]) #<-- This is what your iterable looks like
0
その後、発生します
ValueError: too many values to unpack
ループの最初のパスでは、iは 0 にj等しく、1 に等しくなります。2 番目のパスでi,jは、 が に割り当てられ[0,1,2]ます。明らかに、アンパックするには値が多すぎるため、例外です。
脚注[1] :
for i, j in range(2), range(3):
と同等です
for i, j in (range(2), range(3)):
これはと同等です
iterable = (range(2), range(3))
for i, j in iterable:
使ってみてくださいzip:
for i, j in zip(range(2),range(2)):
print i,j
それは単なるPython構文です。2 つのループ変数が必要な場合、反復オブジェクトには長さ 2 のシーケンスが含まれている必要があります。ただし、あなたのステートメントは次と同じです。
i, j = range(100)
あなたはシーケンスを繰り返しています[range(100), range(100)]。最初の反復は を返しrange(100)ます。前の例からわかるように、これは明らかに失敗しています。
これは、ステートメントをアンパックできるrange(2)長さ 2 のシーケンスを返すため、機能します。i,j