Pythonがリストを巡回するときに要素を削除するいくつかの方法
10048 ワード
質問元:
質問コード:
入力:3,4,1,1,7,9,1出力:[3,4,7,9,1]
リストの1が完全に除去されていないことがわかります.
理由:forで任意の形式の遍歴を開始し、その遍歴順序は最初から決定され、遍歴で要素が削除されると現在のインデックスが変化します.リスト全体の要素は前方に移動するが,iは最初から決定されているため,要素の削除漏れを招く.
解決方法:1.最も簡単な方法
2.
3.リスト解析式を使用します.
4.深いコピーを利用する
Tip:直接b=aはできません.これは、新しい変数と元の変数の物理アドレスが同じであるためです.
5.whileループの使用
6.逆順削除
リストは常に「前に移動」するため、後の要素が変更されても、まだ遍歴されていない要素とその座標は変わらないが、遍歴の長さがリストの長さよりも大きい可能性がある.
参考:リンク:Python–リストを巡回するときに要素を削除する正しい方法.リンク:Pythonリストを巡回するときに要素を削除する
説明:整数リストを入力し、整数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リストを巡回するときに要素を削除する