MyTetra Share
Делитесь знаниями!
python - Получение последнего элемента списка в Python
Время создания: 29.07.2019 23:51
Раздел: !Закладки - Python - Модули
Запись: xintrea/mytetra_db_adgaver_new/master/base/1533668103xi4t166sjh/text.html на raw.githubusercontent.com

python - Получение последнего элемента списка в Python


В 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'



В функции

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

Я бы хотел, чтобы у 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 возвращает iterator (который поддерживает протокол итератора), вы можете передать его результат в 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


 
MyTetra Share v.0.59
Яндекс индекс цитирования