Удалить последний элемент массива python

Сегодня я расскажу о таком типе данных, как списки, операциях над ними и методах, о генераторах списков и о применении списков.

Что такое списки?

Списки в Python – упорядоченные изменяемые коллекции объектов произвольных типов (почти как массив, но типы могут отличаться).

Чтобы использовать списки, их нужно создать. Создать список можно несколькими способами. Например, можно обработать любой итерируемый объект (например, строку) встроенной функцией list:

Список можно создать и при помощи литерала:

Как видно из примера, список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего.

И еще один способ создать список – это генераторы списков. Генератор списков – способ построить новый список, применяя выражение к каждому элементу последовательности. Генераторы списков очень похожи на цикл for.

Возможна и более сложная конструкция генератора списков:

Но в сложных случаях лучше пользоваться обычным циклом for для генерации списков.

Функции и методы списков

Создать создали, теперь нужно со списком что-то делать. Для списков доступны основные встроенные функции, а также методы списков.

Таблица "методы списков"

Метод Что делает
list.append(x) Добавляет элемент в конец списка
list.extend(L) Расширяет список list, добавляя в конец все элементы списка L
list.insert(i, x) Вставляет на i-ый элемент значение x
list.remove(x) Удаляет первый элемент в списке, имеющий значение x. ValueError, если такого элемента не существует
list.pop([i]) Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент
list.index(x, [start [, end]]) Возвращает положение первого элемента со значением x (при этом поиск ведется от start до end)
list.count(x) Возвращает количество элементов со значением x
list.sort([key=функция]) Сортирует список на основе функции
list.reverse() Разворачивает список
list.copy() Поверхностная копия списка
list.clear() Очищает список
Читайте также:  Чем зарядить смарт часы

Нужно отметить, что методы списков, в отличие от строковых методов, изменяют сам список, а потому результат выполнения не нужно записывать в эту переменную.

И, напоследок, примеры работы со списками:

Изредка, для увеличения производительности, списки заменяют гораздо менее гибкими массивами (хотя в таких случаях обычно используют сторонние библиотеки, например NumPy).

Каков наиболее эффективный способ удалить последний элемент из однослойного одномерного массива? (как поп для списка)

1 ответ

Массивы NumPy имеют фиксированный размер, поэтому вы не можете удалить элемент на месте. Например, использование del не работает:

Обратите внимание, что индекс -1 представляет последний элемент. Это потому, что отрицательные индексы в Python (и NumPy) отсчитываются с конца, поэтому -1 – это последний, -2 – это номер перед последним, а -len – фактически первый элемент. Это только для вашей информации на случай, если вы не знали.

Списки Python имеют переменный размер, поэтому легко добавлять или удалять элементы.

Поэтому, если вы хотите удалить элемент, вам нужно создать новый массив или представление.

Вы можете создать новый вид, содержащий все элементы, кроме последнего, используя обозначение среза:

Однако представление разделяет данные с исходным массивом, поэтому, если один изменен, то и другой:

1. Скопируйте вид

Если вам не нравится это совместное использование памяти, вам нужно создать новый массив, в этом случае, вероятно, проще всего создать представление, а затем скопировать (например, с помощью метода copy() массивов) его:

2. Использование индексации целочисленных массивов [ docs ]

Однако вы также можете использовать индексацию целочисленных массивов, чтобы удалить последний элемент и получить новый массив. Это целочисленное индексирование массива всегда (не на 100% уверенно) создает копию, а не представление:

Эта целочисленная индексация массива может быть полезна для удаления произвольных элементов из массива (что может быть сложно или невозможно, если вам нужно представление):

Читайте также:  Белый ярлык на рабочем столе как исправить

Если вы хотите обобщенную функцию, которая удаляет последний элемент, используя индексацию целочисленного массива:

3. Использование индексации логических массивов [ docs ]

Существует также логическое индексирование, которое можно использовать, например:

Это также создает копию! И обобщенный подход может выглядеть так:

Если вам нужна дополнительная информация об индексации NumPys, документация по «Индексации» достаточно хороша и охватывает множество случаев.

4. Использование np.delete()

Обычно я бы не рекомендовал функции NumPy, которые «кажутся» такими, как будто они модифицируют массив на месте (например, np.append и np.insert ), но возвращают копии, потому что они, как правило, излишне медленны и вводят в заблуждение. Вы должны избегать их всякий раз, когда это возможно, поэтому последний пункт в моем ответе. Однако в этом случае это на самом деле идеально подходит, поэтому я должен упомянуть об этом:

5.) Использование np.resize()

У NumPy есть другой метод, который звучит так, как будто он выполняет операцию на месте, но он действительно возвращает новый массив:

Чтобы удалить последний элемент, я просто предоставил новую форму, которая на 1 меньше, чем раньше, которая эффективно удаляет последний элемент.

Да, я писал ранее, что вы не можете изменить массив на месте. Но я сказал это, потому что в большинстве случаев это невозможно или только путем отключения некоторых (абсолютно полезных) проверок безопасности. Я не уверен насчет внутренних компонентов, но в зависимости от старого размера и нового размера, возможно, что это включает в себя (только внутреннюю) операцию копирования, поэтому это может быть медленнее, чем создание представления.

Использование np.ndarray.resize()

Если массив не разделяет свою память с каким-либо другим массивом, то можно изменить размер массива на месте:

Однако это вызовет ValueError s в случае, если на него действительно ссылается другой массив:

Читайте также:  Как найти радиус цилиндра если известна высота

Вы можете отключить эту проверку безопасности, установив refcheck=False но это не следует делать несерьезно, потому что вы делаете себя уязвимым для ошибок сегментации и повреждения памяти в случае, если другая ссылка попытается получить доступ к удаленным элементам! Этот аргумент refcheck должен рассматриваться как опция только для экспертов!

Создание представления действительно быстрое и не занимает много дополнительной памяти, поэтому, по возможности, вы должны стараться работать с представлениями как можно больше. Однако, в зависимости от сценариев использования, не так просто удалить произвольные элементы, используя обычную нарезку. Хотя легко удалить первые n элементов и / или последние n элементов или удалить каждый элемент x (аргумент шага для нарезки), это все, что вы можете сделать с ним.

Но в вашем случае удаления последнего элемента одномерного массива я бы порекомендовал:

потому что они наиболее четко выражают намерение, и каждый с опытом работы с Python / NumPy это поймет.

Основываясь на временных рамках из этого ответа :

Я получаю следующие временные интервалы в виде графика журнала, чтобы охватить все детали, более низкое время по-прежнему означает более быстрое, но диапазон между двумя отметками представляет один порядок величины вместо фиксированной величины. Если вас интересуют конкретные значения, я скопировал их в эту суть :

Согласно этим временам эти два подхода также являются самыми быстрыми. (Python 3.6 и NumPy 1.14.0)

Массив lst дублирует массив d, после несоответствующие маске элементы массива должны быть удалены, но вместо этого питон ругается
IndexError: list index out of range

причем вот в этом месте

Хотя при удалении этой строки все работает

Но мне нужно удалить несоответствующие маске элементы, кто знает в чем проблема?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *