Python 中如何按下标(索引)删除列表元素?

Python 按下标删列表元素:del list[i] 直接删除;list.pop(i) 删除并返回该元素;切片删除多个。本文对比各种方式及遍历时删除的坑。

最佳实践
Python 中如何按下标(索引)删除列表元素?封面

两种主要方式: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))。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台