list.remove(value) 從列表中移除第一個匹配值的元素。不回傳值、就地修改、找不到拋出 ValueError。本文詳細解析行為細節與常見陷阱。
lst.remove(obj)
# 參數:要移除的值(支援任意型別,用 == 比較)
# 回傳:None
# 例外:ValueError (列表中無此值)
# 行為:僅移除第一個匹配項,後續相同值保留
a = [123, 'xyz', 'zara', 'abc', 'xyz']
a.remove('xyz')
print(a) # [123, 'zara', 'abc', 'xyz'] (第一個 'xyz' 被移除)
a.remove('abc')
print(a) # [123, 'zara', 'xyz']
# a.remove('not_exist') # ValueError: list.remove(x): x not in list
# 方法一:先檢查
if 'xyz' in lst:
lst.remove('xyz')
# 方法二:捕獲例外 (EAFP)
try:
lst.remove('xyz')
except ValueError:
pass
# 方法三:列表推導式過濾 (建立新列表,移除所有匹配)
lst = [x for x in lst if x != 'xyz']
| 特性 | remove(x) | pop(i) | del lst[i] |
|---|---|---|---|
| 依據 | 值 | 索引 | 索引/切片 |
| 移除數量 | 第一個匹配 | 單一元素 | 可多個 (切片) |
| 回傳值 | None | 元素值 | None |
| 找不到/越界 | ValueError | IndexError | IndexError |
| 效能 | O(n) 搜尋 + O(n) 位移 | O(1) 尾部 / O(n) 其他 | O(n) 位移 |
| 適用場景 | 知道值、不知索引 | 需取出值、知索引 | 只刪除、不需值 |
# 錯誤:邊遍歷邊移除會跳過元素
for x in lst:
if x == 'bad':
lst.remove(x)
# 正確:反向遍歷或建立新列表
for i in range(len(lst)-1, -1, -1):
if lst[i] == 'bad':
lst.pop(i)
# 或更 Pythonic
lst = [x for x in lst if x != 'bad']
# 方法一:while 迴圈 (就地修改)
while 'bad' in lst:
lst.remove('bad')
# 方法二:列表推導式 (建立新列表,通常更快)
lst = [x for x in lst if x != 'bad']
# 方法三:filter (惰性,Python 3)
lst = list(filter(lambda x: x != 'bad', lst))
class Item:
def __init__(self, id):
self.id = id
def __eq__(self, other):
return isinstance(other, Item) and self.id == other.id
lst = [Item(1), Item(2), Item(1)]
lst.remove(Item(1)) # 移除第一個 Item(1)
print(len(lst)) # 2
實作 __eq__ 讓 remove 能正確識別語意相等物件。
理解 remove 的「首次匹配、就地修改、不回傳」三特性,避開迴圈修改陷阱,是列表操作基本功。