Как взять последний элемент списка python
Перейти к содержимому

Как взять последний элемент списка python

  • автор:

как из списка взять последний элемент? (python)

Author24 — интернет-сервис помощи студентам

есть функция, которая возвращает последний элемент list.pop(), но при этом она же (данная функция) его удаляет из списка.
мне нужно без удаления.

Лучшие ответы ( 1 )

Здесь вы можете заказать любую студенческую или школьную работу.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Почему новый элемент списка каждый раз заменяет последний элемент списка?
Контролер: using Microsoft.AspNetCore.Mvc; using Auto_parts_store.Models.ViewModels; //.

Как удалить последний элемент списка?
// удаление последнего элемента списка void deleteLastItem(Item *ptr) < Item *tmp = NULL;.

Заменить последний положительный элемент списка на второй элемент списка
Вводится список из целых чисел одной строкой через пробел. Нужно заменить последний положительный.

Как удалить последний элемент из односвязного списка?
Всем привет! Пишу курсач по симуляции покупки и продажи изделий компанией через стек. Вроде бы.

Способы извлечения n последних элементов списка в Python

При помощи синтаксиса среза можно сделать гораздо больше. Синтаксис lst[-n] получает элемент n начиная с конца. Таким образом, list[-1] получает последний элемент, list[-2] получает предпоследний и т. д., вплоть до list[-len(list)] , что дает первый элемент.

Получение N последних элементов реверсом списка.

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

# создаем список >>> lst = list(range(10)) >>> lst # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # переворачиваем список, !обратите внимание, # что метод `.reverse()` изменяет список "на месте" # Если нужно сохранить оригинальный список, то # необходимо работать с копией lst_copy = lst.copy() >>> lst.reverse() >>> lst # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] # последние элементы начального списка >>> lst[:5] # [9, 8, 7, 6, 5] 

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

>>> rev_lst = lst[:5] >>> rev_lst.reverse() >>> rev_lst [5, 6, 7, 8, 9] 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Список Python как аргумент по умолчанию
  • Использование списка в качестве стека
  • Использование списка в качестве очереди
  • Генератор списка list
  • Эффективное использование генераторов списков
  • Операция присваивания на месте и списки
  • Поведение списков Python в разных областях видимости
  • Сравнение и идентичность двух списков
  • Как получить несколько последних элементов списка

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Python: получить последний элемент в списке

Введение В этом руководстве мы рассмотрим некоторые из наиболее распространенных способов найти последний элемент в списке в Python. Сначала мы рассмотрим самый простой и самый питонический способ, а затем покажем некоторые другие альтернативные решения. Давайте посмотрим на список, который мы будем использовать: exampleList = [1, 2, «Three», [«Four», 5], 6] Примечание. Список в Python — это набор элементов, которые не обязательно являются того же типа. Один список может содержать элементы, которые являются числами, строками, множеством элементов.

Время чтения: 7 мин.

Вступление

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

Давайте посмотрим на список, который мы будем использовать:

 exampleList = [1, 2, "Three", ["Four", 5], 6] 

Примечание. Список в Python — это набор элементов, которые не обязательно одного типа. Один список может содержать элементы, которые являются числами, строками, вложенными списками и т. Д.

Как получить последний элемент в списке Python

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

  • Использование отрицательной индексации — лучший подход
  • Использование индексации
  • Использование метода pop()
  • Использование нарезки
  • Использование обратного итератора
  • Использование метода reverse()
  • Использование itemgetter
  • Использование петель
Лучшее решение — использование отрицательной индексации

Python поддерживает понятие отрицательной индексации как метод доступа к элементам списка. Это означает, что мы можем получить доступ к элементам в обратном порядке , используя оператор []

Как работает индексация в списках, хорошо известно:

 firstElement = exampleList[0] nthElement = exampleList[n-1] . 

Первый элемент имеет индекс 0 , второй имеет индекс 1 , а n й элемент имеет индекс n-1 .

Отрицательная индексация следует той же логике, но в обратном порядке. Последний элемент имеет индекс -1 , предпоследний элемент имеет индекс -2 и так далее:

 lastElement = exampleList[-1] print("Last element: ", lastElement) print("exampleList: ", exampleList) secondToLast = exampleList[-2] print("Second to last element: ", secondToLast) 
 Last element: 6 exampleList: [1, 2, 'Three', ['Four', 5], 6] Second to last element: ['Four', 5] 

Отрицательная индексация не изменяет исходный список. Это всего лишь способ доступа к элементам без каких-либо изменений в исходном списке.

Это, безусловно, самое простое и наиболее подходящее для Python решение.

Использование индексации

Простая индексация обычно используется для доступа к элементам в списке в исходном порядке с помощью оператора [] Как описано выше, первый элемент имеет индекс 0 , второй элемент имеет индекс 1 и так далее. Зная это, мы можем сделать вывод, что последний элемент имеет индекс len(exampleList)-1 :

 lastElement = exampleList[len(exampleList)-1] print("Last element: ", lastElement) print("exampleList: ", exampleList) secondToLast = exampleList[len(exampleList)-2] print("Second to last element: ", secondToLast) 
 Last element: 6 exampleList: [1, 2, 'Three', ['Four', 5], 6] Second to last element: ['Four', 5] 

Помимо отрицательной индексации, метод индексации используется только для доступа к элементам списка без внесения каких-либо изменений в исходный список.

Использование метода pop ()

В Python метод pop() используется для удаления последнего элемента данного списка и возврата удаленного элемента.

Метод pop() может дополнительно принимать целочисленный аргумент. Это индекс элемента, который мы хотим удалить, поэтому, если мы вызовем exampleList.pop(0) , первый элемент будет удален и возвращен.

Если аргумент — отрицательное число, будет выполнена логика отрицательной индексации, чтобы определить, какой элемент удалить. Вызов exampleList.pop(-1) приведет к удалению последнего элемента examleList .

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

 lastElement = exampleList.pop() print("Last element: ", lastElement) print("exampleList: ", exampleList) 
 Last element: 6 exampleList: [1, 2, 'Three', ['Four', 5]] 

Обратите внимание, что метод pop() по определению изменяет исходный список , удаляя всплывающий элемент.

Использование нарезки

В Python нотация срезов используется для получения подсписка списка. Сама запись довольно проста:

 exampleList[startIndex:[endIndex[:indexStep]]] 

Это означает, что мы можем получить exampleList с индексами, начиная с startIndex , вплоть до endIndex с шагом indexStep .

endIndex и indexStep — необязательные аргументы. Если мы оставим поле endIndex пустым, его значение по умолчанию будет концом исходного списка. Значение по умолчанию для indexStep — 1 .

Если у нас есть список l=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’] и нарезать его, используя l[1:3] результирующий подсписок будет [‘b’, ‘c’, ‘d’] . Это означает, что мы выбираем элементы lits l с индексами 1, 2, and 3 .

l[0:4:2] вернет подсписок, содержащий только элементы с четными индексами — 0, 2, 4 .

Ключевой особенностью нотации срезов, которую мы будем использовать, является то, что она поддерживает отрицательную индексацию.

Это означает, что l[-1:] можно интерпретировать как: получить все элементы в списке l , от последнего элемента до конца списка l . Результирующий подсписок будет содержать только последний элемент исходного списка:

 lastElement = exampleList[-1:][0] # exampleList[-1:] alone will return the sublist - [6] # exampleList[-1:][0] will return the last element - 6 print("Last element: ", lastElement) print("exampleList: ", exampleList) 
 Last element: 6 exampleList: [1, 2, 'Three', ['Four', 5], 6] 

Метод нарезки используется только для доступа к элементам списка и для создания нового списка с их помощью — без внесения каких-либо изменений в исходный список.

Использование обратного итератора

Python имеет две встроенные функции, которые мы будем использовать в этом методе — reversed() и next() .

reversed() принимает список в качестве аргумента и возвращает обратный итератор для этого списка, что означает, что итерация отменяется, начиная с последнего элемента до первого элемента. next() принимает итератор и возвращает следующий элемент из итератора:

 reversedIterator = reversed(exampleList) lastElement = next(reversedIterator) print("Last element: ", lastElement) 
 Last element: 6 exampleList: [1, 2, 'Three', ['Four', 5], 6] 

Обратный метод итератора используется только для доступа к элементам списка в обратном порядке — без внесения каких-либо изменений в исходный список.

Использование метода reverse ()

Метод reverse() используется для переворота элементов списка . Он не принимает никаких аргументов и не возвращает никакого значения, вместо этого он меняет исходный список на место . Это означает, что мы можем перевернуть список и получить доступ к новому первому элементу:

 # Update the original list by reversing its' elements exampleList.reverse() # Access the first element of the updated list lastElement = exampleList[0] print("Last element: ", lastElement) print("exampleList: ", exampleList) 
 Last element: 6 exampleList: [6, ['Four', 5], 'Three', 2, 1] 

Метод reverse() по определению изменяет исходный список, меняя порядок его элементов. Имейте в виду, что такой подход может оказаться действительно неэффективным излишеством, так как для переворота списка требуется время.

Использование itemgetter ()

Модуль operator предоставляет множество эффективных методов, выполняющих все основные операции в Python, такие как математические и логические операции, а также другие операции сравнения объектов и последовательности.

Метод itemgetter() — один из многих методов в модуле operator Он принимает одно или несколько целых чисел в качестве аргумента и возвращает вызываемый объект, который можно рассматривать как тип специальной функции.

Когда мы вызываем operator.itemgetter(0) , результирующий объект будет функцией, которая получит первый элемент в коллекции. Мы также можем присвоить этому объекту имя:

 getFirstElement = operator.itemgetter(0) 

Теперь мы можем передать список в getFirstElement(l) , который возвращает первый элемент из списка l .

Оператор itemgetter() поддерживает отрицательную индексацию, поэтому получение последнего элемента сводится к следующему:

 import operator getLastElement = operator.itemgetter(-1) lastElement = getLastElement(exampleList) print("Last element: ", lastElement) print("exampleList: ", exampleList) 
 Last element: 6 exampleList: [1, 2, 'Three', ['Four', 5], 6] 

Этот подход не изменяет исходный список — он генерирует вызываемый объект, который обращается к нему с помощью индексов.

Использование петель

Теперь гораздо более ручной и элементарный подход будет использовать циклы. Мы можем перебирать список, используя длину списка в качестве последнего шага. Затем, на len(l)-1 мы можем просто вернуть этот элемент:

 for i in range(0, len(exampleList)): if i == (len(exampleList)-1) : lastElement = exampleList[i] print("Last element: ", lastElement) print("exampleList: ", exampleList) 
 Last element: 6 exampleList: [1, 2, 'Three', ['Four', 5], 6] 

Это также не меняет список вообще, а просто получает доступ к элементу.

Заключение

Есть много способов получить последний элемент в списке в Python. Основное беспокойство при выборе правильного для вас способа — погода или нет, вы хотите, чтобы последний элемент был удален.

Если вам нужно получить последний элемент без внесения каких-либо изменений в исходный список, то метод отрицательной индексации является явным победителем. Это самый простой и самый питонический способ решить эту проблему.

С другой стороны, если вам нужно удалить последний элемент, а также получить к нему доступ, вам, вероятно, следует использовать метод pop() , который является встроенным методом для выполнения именно этого поведения.

Licensed under CC BY-NC-SA 4.0

Где можно обращаться к предпоследнему элементу списка как List(END-1) ?

Если сравниваем, то видим, что python и Перл — это кака, а tcl — конфетка. Проблемы питона: а вдруг я не имел в виду индекс с конца, а просто ошибся и неправильно вычислил индекс? А вдруг в списке всего один элемент? Правда, и tcl не выдаст ошибки, а выдаст пустую строку, но зато хотя бы есть способ _ясно_ сказать, что я имею в виду именно элемент энный с конца. Это вроде мелочь, но в tcl таких мелочей много и они хорошо складываются.

Соответственно, вопрос такой: откуда такие красивые мелочи в tcl, и где ещё подобное есть?

И вот предварительные итоги опроса

bar[0 .. $] 

Matlab, Julia — так же как в tcl

xs[end-1] 

red — особый сахар для итераторов, хотя и не совсем то же:

 first back back tail a 

С++ — итераторы приближаются к желаемому, хотя не совсем то

std::prev(std::prev(std::end(some_container))) 

Также есть advance, к-рый позволяет не считать на пальцах. Однако для извлечения подсписка придётся обратиться к списку дважды, или запомнить итератор в переменной. А ещё вот так: std::end(v)[-2];

Rust — примерно то же, что С++, Вот велосипед для извлечения середины списка. Итератор от конца

v.iter().rev() 
data Index = Begin Int | End Int 

По сути это решение можно реализовать в любом ООП языке, если вместо индекса использовать объект, и ввести объект «индекс от конца» — потомок индекса. Тут возникают вопросы про то, что это не интегрировано в стандартную библиотеку. Насчёт интеграции в такую библиотеку некие слова были сказаны, но уверенного «да запросто» я не припомню.

A'Last 

Антиприз достаётся Перлу и Питону, у которых для получения элемента от конца используется отрицательный индекс:

Этот факт не даёт выявить в рантайме такую ошибку, как ошибочно вычисленный отрицательный индекс. Антиприз мог бы получить и сам tcl, поскольку у него доступ к индексу за пределы массива возвращает пустоту. Однако в tcl этот вопрос ортогонален к вопросу получения предпоследнего элемента, а в Питоне и Перле — нет.

den73 ★★★★★
20.08.17 00:46:18 MSK
1 2 3 4 5 →

Поддерживаю. В ЯП не должно быть слишком много синтаксического сахара.

peregrine ★★★★★
( 20.08.17 01:07:18 MSK )
Ответ на: комментарий от peregrine 20.08.17 01:07:18 MSK

Уточнил сказанное. На самом-то деле, это не лишний сахар, а лишний полиморфизм, который перекрывает естественный смысл отрицательного индекса (ошибка) сахарным (индекс от конца).

В tcl полиморфизма нет, а сахар есть.

den73 ★★★★★
( 20.08.17 01:11:58 MSK ) автор топика

Мне нравится голенг тем, что в нем нет синтаксического сахара. Т.е. все, вплоть до конвертации int в int32 происходит явно. Но это пока на сцену не выходит пустой интерфейс, но это уже совсем другая история. В языках в перегрузкой операторов, типа шарпа, например, никто не запрещает сделать свойство End, чтобы выглядело как myCollection.End[-2] которое бы возвращало индексатор, но это уже более ввсокоуровневая абстракция.

nikolnik ★★★
( 20.08.17 01:21:34 MSK )

some_vector.end() - 2; 

evilface ★★
( 20.08.17 01:48:18 MSK )
Ответ на: комментарий от evilface 20.08.17 01:48:18 MSK

std::next(std::rbegin(some_container))
std::prev(std::prev(std::end(some_container)))

Еще вариации на такую тему:

auto i = std::end(some_container); std::advance(i, -2); 
auto i = std::begin(some_container); for (; std::distance(i, std::end(some_container)) != 2; ++i) continue; 

BruteForce ★★★
( 20.08.17 02:45:23 MSK )
Последнее исправление: BruteForce 20.08.17 02:53:23 MSK (всего исправлений: 3)

Ответ на: комментарий от evilface 20.08.17 01:48:18 MSK

Если уже знаешь значение и оно уникально:

auto known_value; auto i = std::find(std::begin(v), std::end(v), known_value); 

Если знаешь значение и хочешь производительности (или гарантированно уникально только в последних двух элементах):

auto known_value; auto i = std::find(std::rbegin(v), std::rend(v), known_value); 

Если знаешь последнее значение и у тебя есть какой-то непонятный итератор:

auto known_value; if (i == std::end(some_container)) i = std::prev(i); else while (*i != known_value) ++i; i = std::prev(i); 

BruteForce ★★★
( 20.08.17 03:00:34 MSK )
Последнее исправление: BruteForce 20.08.17 03:06:40 MSK (всего исправлений: 2)

Проблемы питона: а вдруг я не имел в виду индекс с конца, а просто ошибся и неправильно вычислил индекс?

проблемы питона, такие проблемы питона

shty ★★★★★
( 20.08.17 03:07:38 MSK )

Всё херня надо так

 value = llast(some_list) value = lfirst(some_list) или value = some_list.last value = some_list.first 

Dron ★★★★★
( 20.08.17 03:15:07 MSK )
Ответ на: комментарий от Dron 20.08.17 03:15:07 MSK

А предпоследний? А пятый с конца?

NeXTSTEP ★★
( 20.08.17 03:36:04 MSK )
Ответ на: комментарий от NeXTSTEP 20.08.17 03:36:04 MSK

Тьфу ты, я невнимательно прочёл, тогда так

 value = llast(some_list,-1) //предпоследний value = lfirst(some_list,1) //второй или value = some_list[some_list.last -1] value = some_list[some_list.first,1] 

. херня какая то получилась.

 value = some_list[listlen(some_list, -1)] //предпоследний value = some_list[listlen(some_list, 1)] //второй 

Dron ★★★★★
( 20.08.17 03:50:32 MSK )

А какая практическая польза, как часто приходится брать n элемент с конца списка и при этом по какой-то причине не оформлять это отдельной функцией, которая и с отсутствующим элементом разберется и исключения половит, если надо.

А, ну да, проблемы интерпретируемых языков же.

anonymous
( 20.08.17 04:12:27 MSK )

let array = [1, 2, 3, 4, 5]; let item = array.iter().rev().nth(1); 
 При том вернёт Some(value) если элемент есть и None, если нет.

Deleted
( 20.08.17 05:41:10 MSK )

val *= 5 

В Tcl надо писать:

set val

Такой классный язык, в котором даже присваивание нормально нельзя записать.

rupert ★★★★★
( 20.08.17 06:50:12 MSK )

end = -1 some_list[end-1] 

E ★★★
( 20.08.17 08:17:55 MSK )
Последнее исправление: E 20.08.17 08:18:05 MSK (всего исправлений: 1)

Каждый раз убеждаюсь, что божественный питон просто божественнен

zolden ★★★★★
( 20.08.17 08:43:17 MSK )
Ответ на: комментарий от evilface 20.08.17 01:48:18 MSK

Это ведь наверное итератор? А его ещё нужно «разыменовать». Смотри как можно ещё в tcl:

lrange 1 end-1 

Получится Список упомянут только один раз. Можно так в плюсах?
den73 ★★★★★
( 20.08.17 08:47:43 MSK ) автор топика
Ответ на: комментарий от rupert 20.08.17 06:50:12 MSK

А это часто нужно? А вот более частое засахарено как надо:

incr v 5 # то же, что v += 5 

А вообще у tcl есть не только достоинства, конечно же. Но я сейчас конкретно про end. Просто обнаружил внезапно, что ни в одном другом языке больше такого не видел.

den73 ★★★★★
( 20.08.17 08:53:11 MSK ) автор топика

[1,2,3][-1:]

itn ★★★
( 20.08.17 09:09:22 MSK )

Я всегда думал, что предпоследний — это второй (2) с конца. Перепиши пример так:

end = len(some_list) - 1 # индекс последнего элемента списка, -1 - потому что индексация идет с нуля some_list[end - 1] some_list[len(some_list) - 2] some_list[-2] 

так как «сахар» позволяет не указывать длину списка, ибо она вычисляется автоматически

Но если не охота разбираться в базовых понятиях, на которых посторен язык, то, конечно, это кака и бяка, и что там еще есть.

Virtuos86 ★★★★★
( 20.08.17 09:13:25 MSK )

Ada имхо и VHDL

unixwz
( 20.08.17 09:17:36 MSK )

Если сравниваем, то видим, что python и Перл — это кака, а tcl — конфетка. Проблемы питона: а вдруг я не имел в виду индекс с конца, а просто ошибся и неправильно вычислил индекс? А вдруг в списке всего один элемент?

Тогда ты получишь ошибку в рантайме. Но питон выдаст стэктрейс, который тебя приведет к месту ошибки. Большего от «скриптопараши» и желать нечего. А то, что погроммист иногда допускает описки — в этом нет ничего страшного. Делай перерывы в работе, занимайся физкультурой — сидячая работа, связанная с необходимостью поддерживать концентрацию и умственное напряжение, как ни странно, требует хорошей физподготовки, шахматисты подтвердят.

Правда, и tcl не выдаст ошибки, а выдаст пустую строку, но зато хотя бы есть способ _ясно_ сказать, что я имею в виду именно элемент энный с конца. Это вроде мелочь, но в tcl таких мелочей много и они хорошо складываются.

То есть тикль проглотит твою описку, и тебе это по нраву. Так и запишем.

Virtuos86 ★★★★★
( 20.08.17 09:19:33 MSK )
Последнее исправление: Virtuos86 20.08.17 09:20:27 MSK (всего исправлений: 1)

Ответ на: комментарий от Virtuos86 20.08.17 09:19:33 MSK

Видимо, ты невнимательно прочитал пост. Ещё раз: я говорил о том, что явное указание, что я хочу предпоследний элемент, с помощью слова end, лучше, чем неявное -1, к-рое может с тем же успехом быть ошибкой. Тогда вместо stack trace получишь неправильно работающую программу.

Я здесь не сравниваю питон и тикль в целом. То, что тикль не возвращает ошибки — тоже плохо. Я говорю лишь о красоте этого решения и о том, что оно более правильное, сахарное и редкое.

den73 ★★★★★
( 20.08.17 09:26:07 MSK ) автор топика
Ответ на: комментарий от den73 20.08.17 09:26:07 MSK

Но тогда получается, что ты сейчас обыгрываешь известную проблему «magic numbers». В нормальной, не хеллоуворлдной программе никаких -1, -2 и -N не будет, а будут вычисляемые до места использования переменные типа index_of_item и так далее, либо целое выражение. Нет?

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

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