リストを巡回しながら削除

1540 ワード

間違った方法1:
n = [1,2,3,4,5,6,7,8,9,10]
for x in n:
    n.remove(x)
print(n)

実行結果:
[2, 4, 6, 8, 10]

理由は簡単で、forはリストの反復器を取得し、ループのたびに順番に内容を取得し、今回nを取ると次のループでn+1を取得するが、ループ体ではリストに対してremove操作を行い、ループリストの要素が1つ前にシフトする、すなわちn+1がnになり、n+2がn+1になる.
間違った方法2:
n = [1,2,3,4,5,6,7,8,9,10]
for x in range(len(n)):
    m = n[x]
    n.remove(m)
print(n)

実行結果:
Traceback (most recent call last):
  File "d:/mytest.py", line 3, in 
    m = n[x]
IndexError: list index out of range

原因も簡単で、n中の要素はますます少なくなってxの数字はますます大きくなって、この消彼長は循環が半分になると、配列の下のスケールが境界を越えて現れます.
正しい方法1:
n = [1,2,3,4,5,6,7,8,9,10]
for x in n[:]:
    n.remove(x)
print(n)

実行結果:
[]

コードにはnリストのレプリカが遍歴し,レプリカから各要素を順次取り出し,nに対応するコンテンツを削除する.
正しい方法2:
n = [1,2,3,4,5,6,7,8,9,10]
for x in range(len(n)):
    m = n[0]
    n.remove(m)
print(n)

実行結果:
[]

ループがどのステップに進むかにかかわらず、現在のリストの最初の要素のみが削除され、増加するループ変数を使用しないと、配列の下付きスケール境界は表示されません.
実際のケースでは、2つの素因数リストから最大公約数を計算します.
m = [2,3,3,3] # 54
n = [2,2,3] #12
result = 1
for x in m[:]:
    if x in n:
        result *= x
        m.remove(x)
        n.remove(x)
print(result)

または、
m = [2,3,3,3] # 54
n = [2,2,3] #12
result = 1
for x in range(len(m)):
    r = m[0]
    if r in n:
        result *= r
        n.remove(r)
    m.remove(r)
print(result)