Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: JanuszОтветов: 12

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

pythonlistindexing

Ответы

Ответ 1 · рейтинг 3594 · Sasha Chedygov

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 пуст, потому что в пустом списке не может быть последнего элемента.

Ответ 2 · рейтинг 291 · DevPlayer

Если ваши 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 больше похоже на "последний элемент", чем на объект исключения.

Ответ 3 · рейтинг 120 · Taurus Olson

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

last_elem = alist.pop()

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

Ответ 4 · рейтинг 88 · Atul Arvind

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

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

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

Ответ 5 · рейтинг 73 · Aaron Hall

Как в 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

Ответ 6 · рейтинг 23 · Valentin Podkamennyi

Чтобы предотвратить 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'

Ответ 7 · рейтинг 12 · pylang

lst[-1] - лучший подход, но с общими итерациями рассмотрите _2 _ а>:

Код

import more_itertools as mit


mit.last([0, 1, 2, 3])
# 3

mit.last(iter([1, 2, 3]))
# 3

mit.last([], "some default")
# 'some default'

Ответ 8 · рейтинг 11 · Sanjay Pradeep

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

some_list.reverse()
some_list[0]

Ответ 9 · рейтинг 8 · Sondering Narcissist

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

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

Ответ 10 · рейтинг 8 · Yavuz Mester

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

next(reversed(some_list), None)

Ответ 11 · рейтинг 4 · Radek Anuszewski

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

Ответ 12 · рейтинг 3 · Muneeb Ahmad Khurram

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

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

print(a[-1])

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы