Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Удалить элемент из массива в Python
Введение В этом руководстве будут рассмотрены некоторые распространенные способы удаления элементов из массивов Python. Вот список всех техник и методов, которые мы рассмотрим в этой статье: * remove () * pop () * del * NumPy массивы Массивы в Python Массивы и списки — это не одно и то же в Python. Хотя списки используются чаще, чем массивы, у последних все же есть свои варианты использования. Основное различие между ними заключается в том, что списки могут использоваться для хранения произвольных значений. Они также неоднородны
Время чтения: 3 мин.
Вступление
В этом руководстве будут рассмотрены некоторые распространенные способы удаления элементов из массивов Python. Вот список всех техник и методов, которые мы рассмотрим в этой статье:
Массивы в Python
Массивы и списки — это не одно и то же в Python. Хотя списки используются чаще, чем массивы, у последних все же есть свои варианты использования. Основное различие между ними заключается в том, что списки могут использоваться для хранения произвольных значений. Они также неоднородны, что означает, что они могут одновременно хранить целые числа, строки, другие объекты и т. Д.
С другой стороны, массивы аналогичны массивам в C. Они представляют собой однородные структуры данных для хранения элементов одного типа и используют гораздо меньше памяти, чем списки.
В этом руководстве основное внимание уделяется массивам , а не спискам , хотя большинство методов, показанных в этом руководстве, можно использовать с обеими этими двумя структурами данных.
Использование remove ()
Соответственно, remove() можно использовать с любым массивом в Python. Чтобы использовать его, мы можем просто передать значение элемента, который хотим удалить. Представим, что у нас есть следующий массив:
array = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Чтобы удалить, скажем, элемент 40 , мы просто напишем:
array.remove(40)
Результат — тот же массив без значения 40 :
[10, 20, 30, 50, 60, 70, 80, 90, 100]
Использование pop ()
Функция pop() принимает индекс элемента, который мы хотим удалить. Если бы у нас был тот же массив, что и раньше (со значениями от 10 до 100), мы могли бы написать что-то вроде следующего:
index = 3 array.pop(index)
Если бы мы напечатали результат метода pop, это было бы значение 40 :
[10, 20, 30, 50, 60, 70, 80, 90, 100]
Аналогично тому, как pop() работает в структуре данных стека, здесь pop() также возвращает только что удаленное значение.
Единственная разница в том, что с массивами мы можем удалить произвольный элемент. Со стеками можно удалить только верхний элемент (т.е. последний добавленный).
Используя del
del — ключевое слово python, используемое для удаления объектов. Его точное поведение меняется в зависимости от контекста, поэтому мы также можем использовать его для удаления элементов массива. Еще раз возьмем тот же массив и индекс, что и раньше:
array = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] index = 3
Чтобы удалить элемент с индексом 3 , мы просто вводим следующее:
del array[index]
Если бы мы теперь распечатали содержимое нашего массива, мы бы получили следующий вывод:
[10, 20, 30, 50, 60, 70, 80, 90, 100]
Использование массивов numpy
Массивы NumPy технически также являются массивами, и, поскольку они широко используются (особенно в машинном обучении), давайте покажем один из способов удаления элемента из массива numpy Перед использованием numpy необходимо импортировать его с помощью
import numpy as np
Чтобы создать numpy , мы можем обернуть наш текущий массив, используя np.array() как таковой:
a = np.array(array)
В качестве альтернативы мы могли бы также объявить новый массив внутри самого вызова метода:
a = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
Теперь, чтобы удалить элемент с индексом 3 , мы используем следующий код:
index = 3 a = np.delete(a, index)
delete() — статический метод, объявленный в модуле numpy Он принимает массив и индекс удаляемого элемента.
Метод возвращает новый массив без удаленного элемента:
[10, 20, 30, 50, 60, 70, 80, 90, 100]
Заключение
Есть разные способы удалить элемент массива в Python. Иногда нам может понадобиться удалить элемент по индексу, а иногда по значению. Иногда мы используем массив Python по умолчанию, а иногда массив numpy
Во всех этих случаях хорошо иметь несколько вариантов, которые помогут нам решить, какой из методов использовать.
Licensed under CC BY-NC-SA 4.0
Удаление части элементов списка по срезу
В результате произойдет удаление элементов последовательности sequence от индекса i до индекса j . Операция удаления элементов среза последовательности эквивалентна выполнению sequence[i:j] = [] .
Больше об индексации среза читайте в операции получения среза последовательности и смотрите встроенную функцию slice()
Замечания по операции удаления среза последовательности:
Если индекс j указанного среза выходит за пределы индексации последовательности sequence — j > len(sequence) , то в результате операции произойдет удаление элементов от индекса i последовательности до ее конца.
Если оба индекса указанного среза i > len(sequence) и j > len(sequence) — выходят за пределы индексов последовательности, то в результате операции удаления, последовательность sequence не изменится.
Если индексы указанного среза i и j опущены, то в результате произойдет удаление всей последовательности.
Примеры удаления части элементов списка срезом.
>>> x = [1, 4, 7, 10, 13, 16, 19] >>> del x[1:4] >>> x # [1, 13, 16, 19] # индекс j выходит за пределы последовательности >>> x = [1, 4, 7, 10, 13, 16, 19] >>> del x[5:20] >>> x # [1, 4, 7, 10, 13] # Cрез выходит за пределы последовательности >>> del x[20:] >>> x # [1, 4, 7, 10, 13] # Индексы опущены >>> del x[:] >>> x # [] # Вложенные последовательности >>> x = [[1, 4, 7, 10], [13, 16, 19]] >>> del x[0][1:4] >>> x # [[1], [13, 16, 19]]
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Изменение/замена элемента списка по индексу
- Изменение части списка операцией среза
- Изменение списка срезом c заданным шагом
- Удаление части списка операцией среза
- Удаление части списка по срезу с заданным шагом
- Метод list.append(), добавляет значение в конец списка
- Метод list.clear(), очищает список
- Метод list.copy(), копия списка
- Метод list.extend(), расширяет список другой последовательностью
- Расширение списка его содержимым
- Метод list.insert(), вставить элемент по индексу
- Метод list.pop(), получение с удалением элемент списка
- Метод list.remove(), удаление элемента списка по значению
- Метод list.reverse(), разворачивает элементы списка
- Удаление элемента списка по индексу
- Удаление дубликатов из списка Python с сохранением очередности
Как удалить элемент массива в питоне?
Код не работает, т.к. инструкция del не удаляет элемент, а уменьшает число ссылок на него на 1, del a означает, что нужно уменьшить число ссылок на элемент списка, на который ссылается a , но т.к. в списке остается ссылка на этот элемент, то он никуда не удаляется.
Отслеживать
ответ дан 19 фев 2012 в 15:43
616 3 3 серебряных знака 8 8 бронзовых знаков
Странная логика у вашего скрипта =). Но всеже.
Во время итерации по массивам в питоне не допускается удаление элементов. Для этого либо сделайте копию списка — massiv[:], либо итерируйте по старинке — по индексам. В случае индексов вы получаете доступ к элементам исходного массива.
massiv = ['12', '123', '1234'] for i in range(len(massiv) - 1): for j in range(len(massiv) - 1): if len(massiv[i]) > len(massiv[j]): del massiv[j] elif len(massiv[i]) < len(massiv[j]): del massiv[i] print massiv # =>['1234']
Отслеживать
ответ дан 19 фев 2012 в 17:07
629 4 4 серебряных знака 7 7 бронзовых знаков
1- ваш код ведёт к IndexError для другого ввода 2- код у автора вопроса не удаляет элементы из массива (ни одного). См. объяснение в ответе @l0ki 4- это не рекомендуется, но можно удалять элементы во время итерации (достаточно просто в обратном порядке обходить список, см. пример кода в конце моего ответа) 3- алгоритм у вас кубический, что гораздо хуже линейного решения: lst[:] = [max(lst, key=len)]
24 янв 2017 в 13:12
maxlen= max([len(i) for i in massiv]) massiv=filter(lambda x: len(x)=maxlen, massiv)
Отслеживать
ответ дан 19 фев 2012 в 17:05
17.9k 3 3 золотых знака 47 47 серебряных знаков 86 86 бронзовых знаков
for a in massiv: for b in massiv: if len(a)> len(b): massiv.remove(b) elif len(a)
Буковок больше, НО стало видно, что и откуда мы удаляем, и в целом это более правильный подход. а вообще, исходя из описания топикстартера, вообще не ясно ничего, кроме того, что у него что-то не работает.
P.S: пишите подробнее суть задачи и проблемы 😉
Отслеживать
51.4k 87 87 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков
ответ дан 19 фев 2012 в 13:05
Александр Молофеев Александр Молофеев
2,346 14 14 серебряных знаков 19 19 бронзовых знаков
Рискованный код. .remove(a) удаляет первое вхождение a.
19 фев 2012 в 13:16
for a in massiv и выдаст первый встречный элемент.. риск нулевой если не допускать семнтических ошибок)))
19 фев 2012 в 13:19
for a in massiv -- перебор списка. Причём тут "первый встречный"? И первый, и второй, и третий. Просто при разных значениях massiv последовательность удалений будет весьма причудливой. Возможно правильной, но к человеку, который заставит меня в этом разбираться, я вряд ли буду относиться как к другу. Код -- удаление всех элементов длиной меньше максимальной. Возможно работает, но ну его нафиг.
19 фев 2012 в 13:39
Чтобы удалить элемент из списка lst , если известен его индекс i :
del lst[i]
Чтобы удалить все элементы, кроме элемента с наибольшей длиной:
lst[:] = [max(lst, key=len)]
Идиоматический способ удалить элементы из списка, удовлетворяющие заданному условию, собрать элементы, которые следует оставить и заменить ими все элементы в списке:
lst[:] = [item for item in lst if keep(item)]
Отслеживать
ответ дан 28 ноя 2016 в 20:21
52.3k 11 11 золотых знаков 110 110 серебряных знаков 312 312 бронзовых знаков
а почему не lst[:] = filter(keep, lst)
5 фев 2018 в 11:29
@AndrioSkur: если у вас уже есть функция, то можно filter() использовать, но чаще просто выражение есть типа: if item and item[0] -- в этом случае лучше list comprehension использовать вместо filter + lambda.
5 фев 2018 в 13:05
- Во-первых, это кортеж или статический массив?
- Во-вторых, a и b - это не элементы, это просто моментальное представление.
Должно так быть:
for a in massiv: for b in massiv: if len(a)> len(b): del massiv[b] elif len(a)
Отслеживать
51.4k 87 87 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков
ответ дан 19 фев 2012 в 12:56
Даниил Колясников Даниил Колясников
441 3 3 золотых знака 11 11 серебряных знаков 26 26 бронзовых знаков
Спасибо модераторам за то , что они неоформленную каку превращают в прекрасную конфетку
19 фев 2012 в 13:07
К сожалению код из примера неверен. a и b не являются индексами списка massiv
19 фев 2012 в 13:12
alexlz прав: если a или b не являются числами получим такую неприятность как: Type Error: list indices must be int not string или какой там тип данных у вас. а если там будет все таки число ТО сразу получаем невозможность получить len(integer) но даже если и получите каким-то неведомым образом вы удалите элемент по индексу, а не значению как предполагает задача топика.. при чем такой индекс может просто и не существовать в массиве от сюда получаем list index out of range читаем про изменяемые переменные в python
Как удалить элемент массива в Python?
В этой статье мы поговорим о том, как удалить элемент из массива в Python. Для демонстрации одного из примеров воспользуемся модулем array, определяющим массивы в «Питоне». Перед началом работы необходимо импортировать соответствующую библиотеку. Это делается путём добавления в файл программы строки from array import *.
Итак, представим, что у нас есть массив со следующим содержимым:
from array import * otus_massiv = array('i', [1, 2, 3, 4, 5]) print(otus_massiv)Обратите внимание, что функция array принимает 2 аргумента. Первый — тип создаваемого массива, второй — начальный список значений (в качестве начального списка значений задали простейший набор чисел от 1 до 5). Что касается i, то в нашем случае — это целое знаковое число, которое занимает 2 байта памяти. Кстати, код типа может быть и другим, например, однобайтовым символом (с) или 4-байтовым числом с плавающей точкой (f).
Идём дальше. Удаление элементов в массиве Python может выполняться двумя способами: • pop() — удаление элемента по индексу; • remove() — удаление элемента по значению.
Рассмотрим каждый из них подробнее.
Удаляем элемент в массиве Python с помощью pop()
Операция по удалению выполняется предельно просто:
from array import * otus_massiv = array('i', [1, 2, 3, 4, 5]) otus_massiv.pop(2) # удаляем элемент с индексом 2 print(otus_massiv)Вывод в терминале будет следующим:
array('i', [1, 2, 4, 5])Обратите внимание, что код выше удаляет число 3, т. к. индексация элементов в Python-массиве начинается с нуля.
Если же нам нужно удалить последний элемент из массива, просто не пишите никакой индекс в методе pop() :
from array import * otus_massiv = array('i', [1, 2, 3, 4, 5]) otus_massiv.pop() # метод удаляет последний элемент массива print(otus_massiv)array('i', [1, 2, 3, 4])А теперь давайте проделаем ту же операцию, но без модуля array, представив одномерный массив в виде простейшего списка элементов в Python:
otus_massiv = [1, 2, 3, 4, 5] otus_massiv.pop(2) print(otus_massiv)[1, 2, 4, 5]Как видите, здесь тоже всё предельно просто.
Удаляем элемент в массиве Python с помощью remove()
В некоторых случаях мы не знаем точный индекс элемента в массиве в Python, зато знаем имя элемента. Допустим, речь идёт о следующем одномерном массиве (для удобства сразу отобразим его в виде списка):
otus_massiv = ["online", "courses", "for", "professionals"] print(otus_massiv)Как удалить здесь, к примеру, элемент “online”? Для этого нам пригодится метод remove() :
otus_massiv = ["online", "courses", "for", "professionals"] if "online" in otus_massiv: otus_massiv.remove("online") print(otus_massiv)В результате слово “online” из нашего массива будет удалено:
['courses', 'for', 'professionals']На этом всё, надеюсь, этот материал был вам полезен.
Хотите знать про Python гораздо больше? Записывайтесь на наш курс для продвинутых разработчиков:
