Python удаление элементов из массива
Здорова юные линуксойды! У меня такая задача нужно все четные элементы массива удалить. вот код:
for i in range(len(a)):#a-- это массив if a[i]%2==0: a.remove(a[i]) #он выводит list index out of range. Думаю это связано с удалением элемента из списка. Кто знает решение плиз помогите
levon12341
20.10.16 09:51:23 MSK
умаю это связано с удалением элемента из
эмм, напомни, в чем помощь нужна ? Очевидно что это связано с удалением. Потому что он идет по длине изначального списка (не массива, кстати), по списку который становится короче.
рекомендую просто генерировать новый. Например так
a = [x for x in a if x%2!=0]
Dred ★★★★★
( 20.10.16 09:57:56 MSK )
Это происходит от того, что после удаления элемента массива его длина и индексы элементов ВНЕЗАПНО меняются, а предел цикла — нет.
Удалить элемент из списка, используя его индекс в Python
В этом посте мы обсудим, как удалить элемент из списка, используя его индекс в Python.
1. Использование list.pop() функция
Самый простой подход — использовать список pop([i]) функция, которая удаляет элемент, присутствующий в указанной позиции в списке. Обратите внимание, что это вызывает IndexError если список пуст.
if __name__ == ‘__main__’ :
l = [ 1 , 2 , 3 , 4 , 5 ]
value = l . pop ( n )
print ( «Removed value» , value ) # 3
print ( «Modified list» , l ) # [1, 2, 4, 5]
2. Использование del утверждение
Еще одним эффективным способом удаления элемента из списка с помощью его индекса является del утверждение. Он отличается от pop() функция, так как она не возвращает удаленный элемент. Это также повышает IndexError если список пуст.
if __name__ == ‘__main__’ :
l = [ 1 , 2 , 3 , 4 , 5 ]
print ( «Modified list» , l ) # [1, 2, 4, 5]
3. Использование нарезки
Вы даже можете использовать нарезку для удаления элемента из списка, используя его индекс. Это можно сделать с помощью выражения l[:] = l[:n] + l[n+1:] , куда l ваш список, и n это индекс, значение которого должно быть удалено. Этот подход не рекомендуется, так как он слишком многословен и создает несколько копий списка.
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
Как удалить элемент массива в питоне?
Код не работает, т.к. инструкция 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 золотых знака 46 46 серебряных знаков 86 86 бронзовых знаков
for a in massiv: for b in massiv: if len(a)> len(b): massiv.remove(b) elif len(a)
Буковок больше, НО стало видно, что и откуда мы удаляем, и в целом это более правильный подход. а вообще, исходя из описания топикстартера, вообще не ясно ничего, кроме того, что у него что-то не работает.
P.S: пишите подробнее суть задачи и проблемы 😉
Отслеживать
51.2k 86 86 золотых знаков 266 266 серебряных знаков 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.2k 11 11 золотых знаков 108 108 серебряных знаков 311 311 бронзовых знаков
а почему не 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.2k 86 86 золотых знаков 266 266 серебряных знаков 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