Удаление элементов из списка (массива) в Python: clear(), pop(), remove(), del

Бизнес

Чтобы удалить элемент из списка (массива) типа list в Python, используйте методы list 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 set.

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