Python 中如何按下标(索引)删除列表元素?
Python 按下标删列表元素:del list[i] 直接删除;list.pop(i) 删除并返回该元素;切片删除多个。本文对比各种方式及遍历时删除的坑。
两种主要方式:del my_list[i] 直接删除指定位置的元素;my_list.pop(i) 删除并返回该元素。越界都会抛 IndexError。
del 语句
a = [1, 2, 3, 4, 5]
del a[2]
print(a) # [1, 2, 4, 5]
原地修改,不返回值。支持切片批量删除:
del a[1:3] # 删除下标 1、2 的元素
pop(i):删除并取出
a = [1, 2, 3, 4, 5]
x = a.pop(2)
print(x) # 3
print(a) # [1, 2, 4, 5]
a.pop() 不传参数时删除最后一个元素(栈用法),O(1);按中间下标删是 O(n)(后续元素要前移)。
按值删除:remove
a = [1, 2, 3, 2, 4]
a.remove(2) # 删除第一个值为 2 的元素
print(a) # [1, 3, 2, 4]
遍历中删除的坑
# 错误:边遍历边删会跳过元素
for x in a:
if x % 2 == 0:
a.remove(x)
# 正确:遍历副本,或用列表推导式重建
for x in a[:]:
if x % 2 == 0:
a.remove(x)
# 更 Pythonic
a = [x for x in a if x % 2 != 0]
常见问题(FAQ)
Q:del a[10] 越界会怎样?
A:抛 IndexError。可以先判断 if len(a) > 10。
Q:负下标能用吗?
A:能,del a[-1] 删除最后一个元素,等价于 a.pop()。
Q:删除大量元素性能如何?
A:列表按位置删除是 O(n)。频繁在头部删改用 collections.deque(popleft 是 O(1))。