Pythonがリストを巡回するときに要素を削除するいくつかの方法

10048 ワード

質問元: 説明:整数リストを入力し、整数xを入力し、リスト内のすべての値がxの数を削除し、リストを出力します.
質問コード:
a = list(eval(input()))
x = eval(input())
for i in a:
	if i==x:
		a.remove(i)
print(a)

入力:3,4,1,1,7,9,1出力:[3,4,7,9,1]
リストの1が完全に除去されていないことがわかります.
理由:forで任意の形式の遍歴を開始し、その遍歴順序は最初から決定され、遍歴で要素が削除されると現在のインデックスが変化します.リスト全体の要素は前方に移動するが,iは最初から決定されているため,要素の削除漏れを招く.
解決方法:1.最も簡単な方法
a = list(eval(input()))
x = eval(input())
for i in a[:]:
	if i==x:
		a.remove(i)
print(a)

2.filter()関数を使用して、指定された条件を満たす要素をフィルタします.
a = list(eval(input()))
x = eval(input())
print(list(filter(lambda y: y != x, a)))

3.リスト解析式を使用します.
a = list(eval(input()))
x = eval(input())
b = [i for i in a if i != x]
print(b)

4.深いコピーを利用する
import copy
a = list(eval(input()))
x = eval(input())
b = copy.deepcopy(a)
for i in a:
    if i == x:
        b.remove(i)
print(b)

Tip:直接b=aはできません.これは、新しい変数と元の変数の物理アドレスが同じであるためです.
5.whileループの使用
a = list(eval(input()))
x = eval(input())
while x in a:
    a.remove(x)
print(a)

6.逆順削除
a = list(eval(input()))
x = eval(input())
for i in range(len(a)-1,-1,-1):
    if a[i] == x:
        a.remove(x)
print(a)

リストは常に「前に移動」するため、後の要素が変更されても、まだ遍歴されていない要素とその座標は変わらないが、遍歴の長さがリストの長さよりも大きい可能性がある.
参考:リンク:Python–リストを巡回するときに要素を削除する正しい方法.リンク:Pythonリストを巡回するときに要素を削除する