Python remove() - List 刪除元素

remove() 方法用來移除 list 中第一個符合的元素。

基本用法

fruits = ["apple", "banana", "orange"]
fruits.remove("banana")
print(fruits)  # ['apple', 'orange']

語法

list.remove(element)
  • element:要移除的元素
  • 回傳:None(直接修改原 list)
  • 例外:找不到元素時拋出 ValueError

只移除第一個符合的元素

numbers = [1, 2, 3, 2, 4, 2]
numbers.remove(2)
print(numbers)  # [1, 3, 2, 4, 2](只移除第一個 2)

元素不存在時會報錯

fruits = ["apple", "banana"]

# 會拋出 ValueError
# fruits.remove("orange")  # ValueError: list.remove(x): x not in list

# 安全的做法:先檢查
if "orange" in fruits:
    fruits.remove("orange")

# 或使用 try-except
try:
    fruits.remove("orange")
except ValueError:
    pass  # 元素不存在,忽略

移除所有符合的元素

numbers = [1, 2, 3, 2, 4, 2]

# 使用 while 迴圈
while 2 in numbers:
    numbers.remove(2)
print(numbers)  # [1, 3, 4]

# 或使用 list comprehension(建立新 list)
numbers = [1, 2, 3, 2, 4, 2]
numbers = [n for n in numbers if n != 2]
print(numbers)  # [1, 3, 4]

remove() vs pop()

fruits = ["apple", "banana", "orange"]

# remove() - 依值移除
fruits.remove("banana")
print(fruits)  # ['apple', 'orange']

# pop() - 依索引移除,並回傳被移除的元素
fruits = ["apple", "banana", "orange"]
removed = fruits.pop(1)
print(removed)  # banana
print(fruits)   # ['apple', 'orange']

remove() vs del

fruits = ["apple", "banana", "orange"]

# remove() - 依值移除
fruits.remove("banana")

# del - 依索引移除
fruits = ["apple", "banana", "orange"]
del fruits[1]
print(fruits)  # ['apple', 'orange']

實際範例

移除特定項目

shopping_list = ["milk", "bread", "eggs", "butter"]

# 買完後移除
shopping_list.remove("bread")
print(shopping_list)  # ['milk', 'eggs', 'butter']

過濾黑名單

users = ["alice", "bob", "charlie", "david"]
blacklist = ["bob", "david"]

for user in blacklist:
    if user in users:
        users.remove(user)

print(users)  # ['alice', 'charlie']

安全移除函數

def safe_remove(lst, value):
    try:
        lst.remove(value)
        return True
    except ValueError:
        return False

numbers = [1, 2, 3]
print(safe_remove(numbers, 2))  # True
print(numbers)                   # [1, 3]
print(safe_remove(numbers, 5))  # False

移除重複元素(保持順序)

def remove_duplicates(lst):
    seen = set()
    result = []
    for item in lst:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result

numbers = [1, 2, 2, 3, 3, 3, 4]
unique = remove_duplicates(numbers)
print(unique)  # [1, 2, 3, 4]

迴圈中移除元素的陷阱

在迴圈中移除元素時要小心:

# 錯誤:會跳過元素
numbers = [1, 2, 3, 4, 5]
for n in numbers:
    if n % 2 == 0:
        numbers.remove(n)
print(numbers)  # [1, 3, 5](這個例子剛好正確,但不安全)

# 更危險的例子
numbers = [2, 2, 2, 2]
for n in numbers:
    numbers.remove(n)
print(numbers)  # [2, 2](只移除了一半!)

安全的做法:

# 方法 1:複製 list 後迭代
numbers = [2, 2, 2, 2]
for n in numbers[:]:  # 使用 [:] 複製
    numbers.remove(n)
print(numbers)  # []

# 方法 2:使用 list comprehension
numbers = [1, 2, 3, 4, 5]
numbers = [n for n in numbers if n % 2 != 0]
print(numbers)  # [1, 3, 5]

# 方法 3:倒序迭代
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers) - 1, -1, -1):
    if numbers[i] % 2 == 0:
        numbers.remove(numbers[i])
print(numbers)  # [1, 3, 5]

時間複雜度

remove() 的時間複雜度是 O(n),因為需要搜尋元素並移動後續元素。