2

私はPythonに比較的慣れていないので、ここで何が起こっているのか理解できません。リストをループするために使用する場合、Python は 1 つおきの番号をスキップforしますが、特定の数の要素が入った後でのみです。これは私が取り組んでいるより大きなプロジェクトの一部ですが、このコード スニペットはそれを示しています。

コードは 7 まで正常に機能し、7 になると 1 つおきの数値をスキップし始めます。反復処理中のリストを編集しないことを知っているので、それを避けていますがfor、それらのいくつかを呼び出していません。他の番号ではなく各番号をループさせるにはどうすればよいですか? なぜこれを行うのですか?

コード:

import math

i1 = 60
l1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49, 53, 59]
l3 = l1

print(l1)
for a in l1:
    print(a)
    if a > math.floor(math.sqrt(i1)):
        print("REMOVED: " + str(a))
        l3.remove(a)

print(l3)

出力:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49, 53, 59]
2
3
5
7
11
REMOVED: 11
17
REMOVED: 17
23
REMOVED: 23
31
REMOVED: 31
41
REMOVED: 41
47
REMOVED: 47
53
REMOVED: 53
[2, 3, 5, 7, 13, 19, 29, 37, 43, 49, 59]
4

3 に答える 3

6

l3同じリストを指してl1いる場合、それらを一意にしたい場合は、使用しますl3 = l1[:]

于 2013-09-05T00:05:58.073 に答える
6
l3 = l1

さて、同じリストl3l1参照してください。一方を呼び出すと、もう一方にも影響します。そのため、を反復しながら呼び出すと、(!)内の項目が削除され、後続のすべての要素が下にシフトされ、ループが次の要素に反復され、その結果、項目がスキップされます。remove()l3.remove(a)l1l1

たとえば、次のリストをループして を削除するとしますb

-----------------
| | | | b | c | d |
-----------------
      ^ (私たちはbにいます)

-----------------
| | | | | | c | d |
-----------------
      ^ (b を削除)

-------------
| | | | c | d |
-------------
      ^ (要素を下にシフト)

-------------
| | | | c | d |
-------------
          ^ (ステップ)

スキップしたことに注意してくださいc

おそらくあなたが意味した

l3 = list(l1)  # create a new, independent list
于 2013-09-05T00:06:12.903 に答える
1

反復中にコレクションから要素を削除しません。 同じリストを参照していますl1l3おそらくあなたが意図したのは:

    l3= list(l1)

これでコピーが取れます。

于 2013-09-05T00:06:47.390 に答える