Pythonリストは複数の要素を削除します

1. リストの複数の要素を削除する

問題の背景:
リスト内の要素を削除します。その位置は [1,3,7] です。

a=[1,4,2,1,5,6,9,0]

期待される出力:

最终结果:[1, 2, 5, 6, 9]

列挙型を使用する方法 1:

列挙を直接使用して、インデックスが削除インデックスにあるかどうかを判断します。

[i for num,i in enumerate(a) if num not in del_index]

完全なコード:

a=[1,4,2,1,5,6,9,0]
#删除列表中的元素,其所在的位置为[1,3,7]
del_index=[1,3,7]
tmp=[i for num,i in enumerate(a) if num not in del_index]
print(f"最终结果:{tmp}")

2. Python で List.pop() メソッドを使用する

組み込みメソッド remove を使用して削除しますが、一度に 1 つだけです。

#pop
L.pop([index]) -> item -- remove and return item at index (default last).#(从后往前,有返回值)
#输入为:元素所在的索引
  1. for ループを使用して上記の関数を直接使用すると、エラーが報告されます。! ! 例えば:
--------------------------------------------------------
IndexError             Traceback (most recent call last)
<ipython-input-25-364cdd187e0c> in <module>
      4 b=a.copy()
      5 for i in del_index:
----> 6     b.pop(i)# b.pop(i)
      7 print(b)
      8 

IndexError: list index out of range
  1. 向上:
b=a.copy()
for num,i in enumerate(del_index):
    print(f"{b},被移除的元素:{a[i]}")
    b.pop(i-num)
print(f"最终结果:{b}")

結果は、列挙方法と一致しています。

3. Python で List.remove() メソッドを使用する

c=a.copy()
for num,i in enumerate(del_index):
    print(f"{c},被移除的元素:{a[i]}")
    c.remove(c[i-num])#重复元素
print(f"最终结果:{c}")

出力結果:


[1, 4, 2, 1, 5, 6, 9, 0],被移除的元素:4
[1, 2, 1, 5, 6, 9, 0],被移除的元素:1
[2, 1, 5, 6, 9, 0],被移除的元素:0
最终结果:[2, 1, 5, 6, 9]

削除後の結果は、上記の方法の結果と一致しません. 主な理由は、繰り返し値の問題です, a[3]=1, a[0]=1, したがって、要素 4 を削除した後、元のリストは [1 , 2, 1, 5, 6, 9, 0]. 要素 1 を削除する場合、4 の右側の 1 は削除されているはずですが、remove のデフォルト プロパティにより、最初に出現する 1 が選択されます。除去。結果の値は同じですが、要素のインデックスは他のメソッドの結果と一致しません。

4.注意

  • 最終的な結果に関する限り、列挙メソッドと pop メソッドは繰り返し値の影響を受けませんが、remove は繰り返し値の影響を受けやすいです。最終結果が順序の影響を受けない場合、3 つの違いは無視できます。
  • リストの複数の要素を削除するには列挙型メソッドを使用することをお勧めします. pop() メソッドと remove() メソッドは, リスト要素を削除するときにエラーを起こしやすい. リスト要素を削除した後, リストのサイズがリストが変更されると、リストのインデックスも変更され、エラーが発生します。
  • リストの要素を 1 つだけ削除する場合は、リストの pop() メソッドと remove() メソッドを使用できます。

2. ダブル ポインター メソッドを使用して、リストの複数の要素を削除します。

ダブル ポインター メソッドを使用して、リスト ソリューション リンクの複数の要素を削除します。

1. 問題の説明:

LeetCode link
配列 nums と値 val が与えられた場合、値が val と等しいすべての要素をその場で削除し、削除された配列の新しい長さを返す必要があります。

余分な配列スペースを使用しないでください。O(1) の余分なスペースのみを使用し、入力配列をインプレースで変更する必要があります。

要素の順序は変更できます。新しい長さを超える配列内の要素を考慮する必要はありません。

例 1: nums = [3,2,2,3]、val = 3 の場合、関数は新しい長さ 2 を返す必要があり、nums の最初の 2 つの要素は両方とも 2 です。新しい長さを超える配列内の要素を考慮する必要はありません。

例 2: nums = [0,1,2,2,3,0,4,2]、val = 2 の場合、関数は新しい長さ 5 を返す必要があり、nums の最初の 5 つの要素は 0、1、3 です。 、0、4。

2. 解決策:

ダブルポインター方式 (高速および低速ポインター方式): 高速ポインターと低速ポインターを介して、1 つの for ループの下で 2 つの for ループの作業を完了します
高速ポインターと低速ポインターを定義します。

  • 高速ポインター: 新しい配列の要素を検索します。新しい配列は、対象の要素を含まない配列です
  • スロー ポインター: 新しい配列の添え字が更新される場所を指します。
    削除プロセスは次のとおりです。
    消去

ダブル ポインター メソッドは要素の相対位置を変更しないことに注意してください (リスト要素はその場で削除されます)。

  • 時間の複雑さ: O(n)
  • スペースの複雑さ: O(1)

3. コードは次のとおりです。

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        # 快慢指针
        fast = 0  # 快指针
        slow = 0  # 慢指针
        size = len(nums)
        while fast < size:  # 不加等于是因为,a = size 时,nums[a] 会越界
            # slow 用来收集不等于 val 的值,如果 fast 对应值不等于 val,则把它与 slow 替换
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

3. まとめ

  • リストの複数の要素を削除するには、列挙法とダブルポインタ法を使用することをお勧めします. エラーが発生しやすいリストの pop() メソッドと remove() メソッドを使用することはお勧めしません.
  • リストの要素を 1 つだけ削除する場合は、リストの pop() メソッドと remove() メソッドを使用できます。

4. 関連リンク

  1. Python リスト内の複数要素の削除 (除去)
  2. ダブル ポインター メソッドを使用して、リスト ソリューション リンクの複数の要素を削除します。

おすすめ

転載: blog.csdn.net/flyingluohaipeng/article/details/129395290