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

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


person Janusz    schedule 30.05.2009    source источник


Ответы (18)


some_list[-1] - самый короткий и самый питонический.

Фактически, с этим синтаксисом можно сделать гораздо больше. Синтаксис some_list[-n] получает предпоследний элемент. Итак, some_list[-1] получает последний элемент, some_list[-2] получает предпоследний элемент и т.д., вплоть до some_list[-len(some_list)], что дает вам первый элемент.

Таким же образом можно установить элементы списка. Например:

>>> some_list = [1, 2, 3]
>>> some_list[-1] = 5 # Set the last element
>>> some_list[-2] = 3 # Set the second to last element
>>> some_list
[1, 3, 5]

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

person Sasha Chedygov    schedule 30.05.2009
comment
Мне не хватает чего-то вроде some_list.last - это была бы красивая строчка кода - person Dmitry P.; 20.01.2020

Если ваши str() или list() объекты могут оказаться пустыми: astr = '' или alist = [], тогда вы можете захотеть использовать alist[-1:] вместо alist[-1] для "сходства" объекта.

Значение этого:

alist = []
alist[-1]   # will generate an IndexError exception whereas 
alist[-1:]  # will return an empty list
astr = ''
astr[-1]    # will generate an IndexError exception whereas
astr[-1:]   # will return an empty str

Различие заключается в том, что возвращение пустого объекта списка или пустого объекта str больше похоже на «последний элемент», чем на объект исключения.

person DevPlayer    schedule 09.11.2010
comment
Проголосовали против, потому что я считаю, что суть этого ответа неверна. Получение списка, когда вам нужен элемент, только откладывает неизбежный выход индекса списка за пределы допустимого диапазона - и это то, что должно произойти при попытке получить элемент из пустого списка. Для строк astr [-1:] может быть подходящим подходом, поскольку он возвращает тот же тип, что и astr [-1], но я не думаю, что ':' помогает иметь дело с пустыми списками (и вопрос касается списков) . Если идея состоит в том, чтобы использовать alist [-1:] в качестве условного выражения вместо len (alist) ›0, я думаю, что гораздо удобнее использовать более позднее. (рад проголосовать, если что-то пропустил) - person Stan Kurdziel; 07.06.2015
comment
Ваш голос "против" понятен и действителен. Однако я считаю, что есть два основных лагеря в отношении того, для чего предназначены объекты исключений. Несомненно, исключения останавливают работу вашего приложения. Один лагерь использует исключения в предложениях try, а другой лагерь будет использовать вместо этого структуру if len (alist) ›0 :. В любом случае исключения - это объекты, которые останавливают ваш код. И как таковой для меня меньше объектов последовательности, таких как возвращаемые нулевые последовательности, которые не останавливают ваш код. Я предпочитаю использовать предложения IF для проверки нулевых объектов вместо объектов, которые останавливают мой код, который я вытесняю с помощью предложения try. - person DevPlayer; 08.06.2015
comment
Проголосовали за, потому что синтаксис среза заслуживает обсуждения, однако я согласен с @StanKurdziel в том, что морфология неправильная, вы просто перемещаете стойку ворот - я обнаружил, что мое собственное решение было связано с основным использованием 'добавить это в список, если вы этого не сделали «еще не добавлен» (дельта-линейные графики), поэтому комбинированное выражение if len(my_vector) == 0 or my_vector[-1] != update_val является работоспособным шаблоном. но это, конечно, не глобальное решение - было бы неплохо иметь синтаксическую форму, в которой результатом было None - person Mark Mullin; 05.03.2017
comment
Почему бы вам избежать IndexError? Если вы попытаетесь проиндексировать пустой список или строку, вы получите исключение. Если вы хотите обработать это исключение, используйте try / except - для этого он нужен. - person Chris Johnson; 01.08.2018

Вы также можете:

last_elem = alist.pop()

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

person Taurus Olson    schedule 30.05.2009

Самый простой способ отобразить последний элемент в Python -

>>> list[-1:] # returns indexed value
    [3]
>>> list[-1]  # returns value
    3

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

person Atul Arvind    schedule 20.08.2012
comment
если длина вашего списка равна нулю, это решение работает, а list[-1] будет ошибкой. - person anon01; 15.02.2018

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

Чтобы получить последний элемент,

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

передайте -1 в индексную запись:

>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'

Объяснение

Индексы и срезы могут принимать отрицательные целые числа в качестве аргументов.

Я изменил пример из документации, чтобы указать, какой элемент в последовательности каждый индекс ссылки, в данном случае в строке "Python", -1 ссылаются на последний элемент, символ, 'n':

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
   0   1   2   3   4   5 
  -6  -5  -4  -3  -2  -1

>>> p = 'Python'
>>> p[-1]
'n'

Присвоение через повторяющуюся распаковку

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

>>> *head, last = a_list
>>> last
'three'

Имя переменной head привязывается к ненужному вновь созданному списку:

>>> head
['zero', 'one', 'two']

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

*_, last = a_list

Или, действительно, если вы знаете, что это список (или, по крайней мере, принимает индексную нотацию):

last = a_list[-1]

В функции

Комментатор сказал:

Я бы хотел, чтобы у Python была функция для first () и last (), как у Lisp ... это избавило бы от множества ненужных лямбда-функций.

Их было бы довольно просто определить:

def last(a_list):
    return a_list[-1]

def first(a_list):
    return a_list[0]

Или используйте operator.itemgetter:

>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)

В любом случае:

>>> last(a_list)
'three'
>>> first(a_list)
'zero'

Особые случаи

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

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

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

Нарезка

Срез списка возвращает новый список - поэтому мы можем разрезать от -1 до конца, если нам нужно, чтобы элемент был в новом списке:

>>> a_slice = a_list[-1:]
>>> a_slice
['three']

Это дает положительный эффект, если список пуст:

>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
...     do_something(tail)

В то время как при попытке доступа по индексу возникает IndexError, который необходимо обработать:

>>> empty_list[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Но опять же, нарезку для этой цели следует производить только в том случае, если вам нужно:

  • новый список создан
  • и новый список должен быть пустым, если предыдущий список был пуст.

for петель

Как особенность Python, в цикле for нет внутренней области видимости.

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

>>> def do_something(arg): pass
>>> for item in a_list:
...     do_something(item)
...     
>>> item
'three'

Семантически это не последний пункт в списке. Это семантически последнее, к чему было привязано имя item.

>>> def do_something(arg): raise Exception
>>> for item in a_list:
...     do_something(item)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 1, in do_something
Exception
>>> item
'zero'

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

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

Получение и удаление

Мы также можем изменить наш исходный список, удалив и вернув последний элемент:

>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']

Но теперь исходный список изменен.

(-1 фактически является аргументом по умолчанию, поэтому list.pop можно использовать без аргумента индекса):

>>> a_list.pop()
'two'

Только сделай это, если

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

Это допустимые варианты использования, но не очень распространенные.

Сохраним остальное в обратном порядке на потом:

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

>>> next(reversed([1,2,3]))
3

Это похоже на обратное:

>>> next(iter([1,2,3]))
1

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

reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)

use_later = list(reverse_iterator)

и сейчас:

>>> use_later
[2, 1]
>>> last_element
3
person Aaron Hall    schedule 23.06.2017

Чтобы предотвратить IndexError: list index out of range, используйте этот синтаксис:

mylist = [1, 2, 3, 4]

# With None as default value:
value = mylist and mylist[-1]

# With specified default value (option 1):
value = mylist and mylist[-1] or 'default'

# With specified default value (option 2):
value = mylist[-1] if mylist else 'default'
person Valentin Podkamennyi    schedule 13.04.2019


Другой способ:

some_list.reverse() 
some_list[0]
person Sanjay Pradeep    schedule 10.01.2016
comment
Это простой метод, при котором вы можете проделать ту же операцию и с O(n), даже если у вас есть возможность сделать это с O(1). - person say_my_name; 08.06.2021

list[-1] получит последний элемент списка без изменения списка. list.pop() получит последний элемент списка, но изменит исходный список. Обычно изменять исходный список не рекомендуется.

В качестве альтернативы, если по какой-то причине вы ищете что-то менее питоническое, вы можете использовать list[len(list)-1], если список не пуст.

person Sondering Narcissist    schedule 07.10.2016
comment
Вероятно, неправильно предполагать, что изменение исходного списка обычно не рекомендуется, потому что, в конце концов, это очень часто выполняется. - person Aaron; 01.12.2016

Вы также можете использовать приведенный ниже код, если не хотите получать IndexError, когда список пуст.

next(reversed(some_list), None)
person Yavuz Mester    schedule 02.06.2017

Хорошо, но как насчет общего почти для всех языков items[len(items) - 1]? Это ИМО самый простой способ получить последний элемент, потому что он не требует каких-либо знаний питоники.

person Radek Anuszewski    schedule 07.10.2015
comment
items [len (items) - 1] - это, по сути, то, что Python делает под капотом, но поскольку len последовательности уже хранится в последовательности, нет необходимости ее подсчитывать, вы создаете больше работы, чем необходимо. - person Dan Gayle; 10.10.2015
comment
так как вы пишете Python, вам действительно стоит попытаться быть более Pythonic - person Michael Wu; 27.10.2015
comment
@MichaelWu Нет смысла это делать. Пифонический способ часто не требует пояснений, требует большего внимания, когда вам нужно вводить новых людей в проект, и, конечно, не будет работать, когда вам нужно переключиться на другие языки, такие как Java - вы не можете использовать специальные знания Python. Когда вы опускаете питонический путь, насколько это возможно, тогда намного проще вернуться к проекту через несколько месяцев / лет. - person Radek Anuszewski; 31.10.2015
comment
@Pneumokok Вы подчеркиваете, но я бы сказал, что индексирование списков - это очень базовый метод Python по сравнению, скажем, с генераторами. Кроме того, зачем использовать что-либо, кроме C или, возможно, javascript, если вы не собираетесь использовать преимущества отдельных языковых инструментов и синтаксиса? Тогда вы сможете постоянно делать все жестко во всех своих проектах. - person Matthew Purdon; 03.12.2015
comment
Хотя он не очень питоничен, я думаю, что он в некоторых отношениях лучше, чем подход some_list[-1], потому что он более логичен и показывает, что он на самом деле делает лучше, чем some_list[-1], на мой взгляд. - person Byron Filer; 05.11.2016
comment
Что будет с my_test = [] last_item = my_test[len(my_test) - 1]. Это также вызовет исключение для IndexError, как и другие ответы. Хотя я считаю, что исключения допустимы и хороши, потому что я знаю, что делать с моим предпочтительным try:...except:...else:...finally:... шаблоном кодирования на Python. - person Fr0zenFyr; 14.04.2018

Питонический путь

Итак, давайте рассмотрим, что у нас есть список a = [1,2,3,4], в Python List можно манипулировать, чтобы предоставить нам его часть или его элемент, используя следующую команду, можно легко получить последний элемент.

print(a[-1])
person Muneeb Ahmad Khurram    schedule 09.05.2021

Вот решение для вашего запроса.

a=["first","middle","last"] # A sample list
print(a[0]) #prints the first item in the list because the index of the list always starts from 0.
print(a[-1]) #prints the last item in the list.
print(a[-2]) #prints the last second item in the list.

Выход:

>>> first
>>> last
>>> middle
person Code Carbonate    schedule 03.07.2020

Чтобы избежать IndexError: list index out of range, вы можете использовать этот фрагмент кода.

list_values = [12, 112, 443]

def getLastElement(lst):
    if len(lst) == 0:
        return 0
    else:
        return lst[-1]

print(getLastElement(list_values))
person HASAN HÜSEYİN YÜCEL    schedule 23.03.2021
comment
Проблема с этим решением заключается в том, что в случае len(lst) == 0 он вернет строку, когда вы ждете int. - person raulmd13; 29.03.2021
comment
Фиксированный.......... - person HASAN HÜSEYİN YÜCEL; 29.03.2021
comment
Я хотел сказать, что этот метод работает с заданным типом данных. Его нельзя использовать для всех типов списков. Но это неплохой ответ. - person raulmd13; 30.03.2021

Вам просто нужно взять индекс и поставить [-1]. Например:

list=[0,1,2]
last_index=list[-1]
print(last_index)

На выходе вы получите 2.

person AI Nerd    schedule 07.05.2021

Доступ к последнему элементу из списка в Python:

1: доступ к последнему элементу с отрицательным индексом -1

>> data = ['s','t','a','c','k','o','v','e','r','f','l','o','w']
>> data[-1]
'w'

2. Доступ к последнему элементу с помощью метода pop ()

>> data = ['s','t','a','c','k','o','v','e','r','f','l','o','w']
>> data.pop()
'w'

Однако метод pop удалит последний элемент из списка.

person Gunjan    schedule 04.06.2021
comment
Хотя это правда, .pop является деструктивным (как поясняется другими ответами). Он не только получает последний элемент из списка, но и удаляет его из списка. - person Wondercricket; 08.06.2021

Если вы сделаете my_list[-1], это вернет последний элемент списка. Индексы отрицательной последовательности представляют позиции от конца массива. Отрицательная индексация означает начало с конца, -1 относится к последнему элементу, -2 относится к второму последнему элементу и т. Д.

person Hadi Mir    schedule 26.12.2020

Не удалось найти ни одного упоминания об этом. Итак, добавление.

Вы также можете попробовать some_list[~0].

Это символ тильда

person Underoos    schedule 23.06.2021