私は組み合わせ要素の二つは別の変数t
に等しい場合、発見するためにfor
ループを実行している整数のリストを持っています。したがって、t
が10
に等しければ、私はintergerのリストを持っていました: l = [1,2,3,4,5,8,9]
の場合、この関数は数字の組み合わせがすべて(1,9)
,(2,8)
のものを出力するはずです。forループが私のリスト内の要素をスキップするのはなぜですか?
私はほとんどが午前感じるが、私は.pop()
機能を使用するときに奇妙な何かがリストに起こります。以下のコードは、計算が必要な数字の組み合わせをすべて表示するために使用されていますが、リストの他のすべての要素はスキップされます。ここで
l = [1,2,5,8,13,15,26,38]
c = 10
for i in l:
first = i
l.pop(0)
for x in l:
second = x
print(first,second)
が出力されます。
1 2
1 5
1 8
1 13
1 15
1 26
1 38
5 5
5 8
5 13
5 15
5 26
5 38
13 8
13 13
13 15
13 26
13 38
26 13
26 15
26 26
26 38
お知らせ方法2
、8
、15
、そして38
がスキップされます。 二for
ループは元の値を使用することはありませんし、次の反復は、リストの次の要素を反復処理するために行くことができるように、私はl.pop
を使用しています。何をしようとする
私は確かに、Pythonの専門家ではないんだけど、私は他のオブジェクト指向言語ではそれが一般的にイテレータまたはループ内から反復処理されたコレクションのいずれかを変更するにはかなり悪いアイデアだと考えていることを伝えることができます。私の最初の疑惑はここにあるだろう。あなたはリストからポップアップして、舞台裏でリスト[1]を参照しようとします...リストを変更したので、list [1]は期待どおり2ではなく5になりました。 –
@DavidHoelzerは正しい答えを得たと思います。 –
@AndrewRushton:むしろ人為的な制約です...リストのコピーを反復する方が安全ですが、リスト上で_backwardsを反復すると、現在反復中のリストから要素を安全に削除できます。 BTW '.pop(0)'は、リストを強制的に残りのすべてのリスト要素を強制的にギャップを埋めるように強制するので、むしろ非効率的です。 –