在Python中从列表(数组)中删除元素:clear(), pop(), remove(), del

商业

要从 Python 中的 list (array) 类型的列表中删除一个元素,可以使用列表方法 clear()、pop() 和 remove() 。你也可以通过使用 index 或 slice 来指定列表的位置和范围,然后使用 del 语句删除它。

这里提供了以下信息。

  • 删除所有元素:clear()
  • 在指定的位置删除一个元素并获得其值。:pop()
  • 搜索具有指定值的元素并删除第一个元素。:remove()
  • 通过指定索引片中的位置和范围进行删除:del
  • 批量删除符合标准的多个元素。:列表中包含的指示

注意,列表可以存储不同类型的数据,与数组有严格的区别。当你想为需要内存大小或内存地址的进程处理数组时,或为大规模数据的数值计算时,请使用array(标准库)或NumPy。

删除所有元素: clear()

在列表方法clear()中,所有的元素都被移除,结果是一个空列表。

l = list(range(10))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

l.clear()
print(l)
# []

在指定的位置删除一个元素并获得其值。: pop()

列表的pop()方法可以用来删除指定位置的一个元素,并获得该元素的值。

第一个(初始)数字是0。

l = list(range(10))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(l.pop(0))
# 0

print(l)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(l.pop(3))
# 4

print(l)
# [1, 2, 3, 5, 6, 7, 8, 9]

也可以用一个负值来指定从结束(最后)开始的位置。末尾(最后)是-1。

print(l.pop(-2))
# 8

print(l)
# [1, 2, 3, 5, 6, 7, 9]

如果省略了参数,也没有指定位置,那么最后(最后)的元素将被删除。

print(l.pop())
# 9

print(l)
# [1, 2, 3, 5, 6, 7]

指定一个不存在的位置将导致一个错误。

# print(l.pop(100))
# IndexError: pop index out of range

请注意,pop(0),即移除第一个元素,需要以下成本,不是一个有效的操作。关于列表上各种操作的计算复杂度,请参见官方维基上的以下页面。
O(n)

O(1)标准库集合模块中提供了deque类型,作为一种以这种代价将元素删除到顶部的类型。例如,如果你想把数据当作一个队列(FIFO),使用deque会更有效率。

搜索具有指定值的元素并删除第一个元素。: remove()

列表方法remove()可以用来搜索与指定值相同的元素,并删除第一个元素。

l = ['Alice', 'Bob', 'Charlie', 'Bob', 'Dave']
print(l)
# ['Alice', 'Bob', 'Charlie', 'Bob', 'Dave']

l.remove('Alice')
print(l)
# ['Bob', 'Charlie', 'Bob', 'Dave']

如果列表中包含多个与指定值相匹配的元素,只有第一个元素会被删除。

l.remove('Bob')
print(l)
# ['Charlie', 'Bob', 'Dave']

如果指定了一个不存在的值,就会发生错误。

# l.remove('xxx')
# ValueError: list.remove(x): x not in list

通过指定索引片中的位置和范围进行删除: del

你也可以使用del语句从列表中删除元素。

通过索引指定要删除的元素。第一个(初始)索引是0,最后一个(最终)索引是-1。

l = list(range(10))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

del l[0]
print(l)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

del l[-1]
print(l)
# [1, 2, 3, 4, 5, 6, 7, 8]

del l[6]
print(l)
# [1, 2, 3, 4, 5, 6, 8]

如果你用切片指定一个范围,你可以一次删除多个元素。

l = list(range(10))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

del l[2:5]
print(l)
# [0, 1, 5, 6, 7, 8, 9]

l = list(range(10))
del l[:3]
print(l)
# [3, 4, 5, 6, 7, 8, 9]

l = list(range(10))
del l[4:]
print(l)
# [0, 1, 2, 3]

l = list(range(10))
del l[-3:]
print(l)
# [0, 1, 2, 3, 4, 5, 6]

也可以指定整个范围并删除所有元素。

l = list(range(10))
del l[:]
print(l)
# []

[start:stop:step]如果你以这种方式指定切片中的范围,并指定增量步骤,你可以一次删除多个跳转元素。

l = list(range(10))
del l[2:8:2]
print(l)
# [0, 1, 3, 5, 7, 8, 9]

l = list(range(10))
del l[::3]
print(l)
# [1, 2, 4, 5, 7, 8]

关于切片的更多信息,请参见以下文章。

批量删除符合标准的多个元素。: 列表中包含的指示

删除满足条件的元素的过程等同于留下(提取)不满足条件的元素的过程。列表理解符号被用于这种处理。

一个去除奇数或偶数元素(=留下偶数或奇数元素)的例子显示如下。
%这就是余数运算符。
i % 2
这就是i的余数除以2。

在列表理解的符号中,一个新的列表被创建。与到目前为止介绍的列表类型方法不同,原始列表保持不变。

l = list(range(10))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print([i for i in l if i % 2 == 0])
# [0, 2, 4, 6, 8]

print([i for i in l if i % 2 != 0])
# [1, 3, 5, 7, 9]

print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

其他例子。根据条件表达式的不同,可以进行各种处理。

l = ['Alice', 'Bob', 'Charlie', 'Bob', 'David']
print(l)
# ['Alice', 'Bob', 'Charlie', 'Bob', 'David']

print([s for s in l if s != 'Bob'])
# ['Alice', 'Charlie', 'David']

print([s for s in l if s.endswith('e')])
# ['Alice', 'Charlie']

如果你想删除重复的元素,请使用set集合类型。

print(list(set(l)))
# ['David', 'Alice', 'Charlie', 'Bob']