Способы извлечения 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 (Списки)
Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Изменяемые списки создаются через квадратные скобки. Элементы могут повторяться и меняться. Доступ к отдельному элементу тоже через квадратные скобки. Отсчёт с 0.
Узнать все методы списка можно через команду.
help(list)
Рассмотрим некоторые примеры.
cats = ["Барсик", "Мурзик", "Васька"] print(cats) # все элементы списка print(cats[1]) # один указанный элемент numbers = [0, 1, 2, 3, 4, 5] print(numbers) print(numbers[4]) // список из строки mylist = list('Барсик') print(mylist)
В списке могут быть разные типы. Поместим в список числа и строки.
mix = ["one", 3, "two", "three", 9, 3] print(mix[1]) print(mix[2])
Можно создать пустой список.
empty = [] print(empty) # []
В качестве индекса можно указать отрицательные значения. Так индекс -1 вернёт последний элемент списка, -2 предпоследний и т.д.
numbers = [0, 1, 2, 3, 4, 5] print(numbers[-1]) #5 print(numbers[-2]) #4 print(numbers[-3]) #3
Развернуть список можно через reverse().
reversed = [1, 2, 3, 4, 4] reversed.reverse() print (reversed) # [4, 4, 3, 2, 1] kitten = list("Барсик") kitten.reverse() print(kitten) # ['к', 'и', 'с', 'р', 'а', 'Б']
Сортировать можно через sort().
mylist = [8, 2, 11, 4, 3] mylist.sort() print (mylist)
Можем заменить существующие элементы списка.
numbers = [0, 1, 2, 3, 4, 5] numbers[0] = 10 numbers[5] = 22 print(numbers[-1]) print(numbers[0])
Добавить новый элемент в конец списка можно через append().
numbers = [0, 1, 2, 3, 4, 5] numbers.append(99) print(numbers[-1])
Можно вставить элемент в нужную позицию через insert(), указав индекс.
numbers = [0, 1, 2, 3, 4, 5] numbers = [0, 1, 2, 3, 4, 5] numbers.insert(1, 33) print(numbers[1]) print(numbers) # [0, 33, 1, 2, 3, 4, 5]
Удалить элемент по указанному индексу можно через remove().
numbers = [0, 1, 2, 3, 4, 5] numbers.remove(5) print(numbers) # [0, 1, 2, 3, 4]
Метод pop() также позволяет удалить элемент по индексу, но при этом возвращает значение удалённого элемента. Если индекс не указан, то удаляется последний элемент.
numbers = [6, 3, 9, 5, 1, 5] poped = numbers.pop(2) print(poped) # 9 poped = numbers.pop() print(poped) # 5
Есть ещё способ удаления по индексу через инструкцию del.
Когда удаляется элемент с индексом 1, элемент, имевший индекс 2, становится элементом с индексом 1, элемент, имевший индекс 3, приобретает индекс 2 и так далее. Соответственно, количество индексов при удалении элемента уменьшается.
Можно запускать команду del numbers[1] снова и снова, удаляя по одному элементу списка. Главное, это вовремя остановиться, чтобы не получить ошибку при удалении несуществующего индекса.
Длину списка можно узнать через len().
numbers = [6, 8, 2, 5, 1, 5] print(len(numbers)) # 6
Узнать количество одинаковых элементов в списке можно через count().
kitten = list('котёнок') print(kitten.count('к')) # 2
Список можно расширить другим списком через extend(). Новые элементы добавляются в конец первого списка.
oneList = [6, 8, 2, 5, 1, 5] secondList = [0, 1, 4] oneList.extend(secondList) print(oneList) # [6, 8, 2, 5, 1, 5, 0, 1, 4]
Два списка можно сложить и получить третий список.
firstList = [6, 8, 2, 5, 1, 5] secondList = [0, 1, 4] bigList = firstList + secondList print(bigList) # [6, 8, 2, 5, 1, 5, 0, 1, 4]
Пройтись по всем элементам списка можно через цикл for.
numbers = [1, 2, 3] for element in numbers: print(element)
Фильтрация списка через filter() с лямбдой
Мы можем фильтровать элементы списка по заданному условию, используя класс filter и лямбда-выражения.
Допустим, у нас есть список чисел от 1 до 10 и мы хотим оставить числа меньше 5. Применяем к списку функцию filter(), в котором указываем лямбда-выражение — берётся каждый элемент списка и проверяется условие. Если число меньше 5, то условие выполняется и число попадает в объект класса filter. Затем мы создаём новый список, куда помещаем созданный объект и на выходе получаем финальный результат — отфильтрованный список.
sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] filterObj = filter(lambda x: x < 5, sourceList) print(type(filterObj)) # filteredList = list(filterObj) print(filteredList) # [1, 2, 3, 4]
Существует другой громоздкий вариант через цикл for, который не стал приводить здесь.
Вместо лямбда-выражения можно использовать именную функцию. Создадим именную функцию под именем isGreater и зададим условие - числа должны быть больше 5.
def isGreater(x): return x > 5 sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] filteredList = list(filter(isGreater, sourceList)) print(str(filteredList))
Проекция на список через map() с лямбдой
Если нужно пройтись по всем элементам списка и что-то с ним сделать, то подойдёт функция map(). Допустим, мы хотим увеличить значение каждого элемента на заданную величину.
sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] mapObj = map(lambda x: x + 9, sourceList) print(type(mapObj)) # mappedList = list(mapObj) print(mappedList) # [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Вырезка последовательности
Вырезка последовательности (получение фрагмента) применима к спискам, кортежам и строкам. Иногда используется термин "срез".
item[START:STOP:STEP]
Операция вырезки производится при помощи указания имени последовательности, за которым идёт пара чисел в квадратных скобках, разделённых двоеточием. Третий аргумент отвечает за шаг и используется реже (см. ниже).
Первое число перед двоеточием указывает позицию начала вырезки, а второе число после двоеточия указывает, где вырезка заканчивается. Если первое число не указано, вырезка начинается с начала последовательности. Если пропущено второе число, Python закончит вырезку у конца последовательности. Обратите внимание, что полученная вырезка будет начинаться с указанной начальной позиции, а заканчиваться прямо перед указанной конечной позицией, т.е. начальная позиция входит в вырезку, а конечная – нет.
sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(sourceList[1:4]) # со второго до четвёртого print(sourceList[5:]) # с шестого элемента до конца print(sourceList[1:-1]) # со второго до предпоследнего print(sourceList[:]) # все элементы
[2, 3, 4] [6, 7, 8, 9, 10] [2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Можно указать шаг вырезки в третьем аргументе (по умолчанию шаг вырезки равен 1):
sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(sourceList[1:8:2]) # [2, 4, 6, 8]
с помощью срезов можно не только извлекать элементы, но и добавлять и удалять элементы (только для изменяемых списков).
sourceList = [1, 2, 3, 4, 5] sourceList[1:3] = [7, 7, 7] # добавим три новых элемента вместо второго и третьего элемента print(sourceList) # [1, 7, 7, 7, 4, 5] del sourceList[:-3] # удаляем первые элементы списка до третьего элемента с конца print(sourceList) # [7, 4, 5]
Как вывести последний элемент списка python
Запись: xintrea/mytetra_db_adgaver_new/master/base/1533668103xi4t166sjh/text.html на raw.githubusercontent.com
python - Получение последнего элемента списка в Python
В Python, как вы получаете последний элемент списка?
Чтобы просто получить последний элемент,
- без изменения списка и
- Предполагая, что вы знаете, что список имеет последний элемент (т.е. он не пуст)
передать -1 в индексную нотацию:
>>> a_list = ['zero', 'one', 'two', 'three']
Индексы и срезы могут принимать отрицательные целые числа в качестве аргументов.
Я изменил пример из документации , чтобы указать, какой элемент в последовательности ссылается на каждый индекс, в этом случае в строке "Python" , -1 ссылается на последний элемент, символ, 'n' :
| P | y | t | h | o | n |
Я бы хотел, чтобы у Python была функция для first() и last(), как Lisp. она избавилась бы от множества ненужных лямбда-функций.
Это было бы довольно просто определить:
Или используйте operator.itemgetter :
Если вы делаете что-то более сложное, вы можете обнаружить, что он более эффективен, чтобы получить последний элемент несколькими разными способами.
Если вы новичок в программировании, вам следует избегать этого раздела, потому что он вместе соединяет семантически разные части алгоритмов. Если вы измените свой алгоритм в одном месте, это может иметь непреднамеренное воздействие на другую строку кода.
Я пытаюсь предоставить предостережения и условия как можно полнее, но я, возможно, что-то пропустил. Прошу прокомментировать, если вы думаете, что я оставляю предупреждение.
Слайд списка возвращает новый список, поэтому мы можем отрезать от -1 до конца, если мы хотим, чтобы этот элемент появился в новом списке:
Это имеет недостаток, если не пуст, если список пуст:
В то время как попытка доступа по индексу вызывает IndexError , который необходимо обработать:
Traceback (most recent call last):
File "", line 1, in
IndexError: list index out of range
Но опять же, нарезка для этой цели должна выполняться только в случае необходимости:
- создан новый список
- и новый список будет пустым, если предыдущий список пуст.
Как функция Python, внутри цикла for нет внутреннего охвата.
Если вы выполняете полную итерацию по списку, последний элемент по-прежнему будет ссылаться на имя переменной, назначенное в цикле:
>>> def do_something(arg): pass
>>> for item in a_list:
Это не семантически последнее в списке. Это семантически последнее, что связано с именем item .
>>> def do_something(arg): raise Exception
>>> for item in a_list:
Traceback (most recent call last):
File "", line 2, in
File "", line 1, in do_something
Таким образом, это нужно использовать только для получения последнего элемента, если вы
- уже зацикливаются, а
- вы знаете, что цикл завершится (не прерывается или не выходит из-за ошибок), в противном случае он укажет на последний элемент, на который ссылается цикл.
Получение и удаление
Мы также можем изменить наш исходный список, удалив и вернув последний элемент:
Но теперь исходный список изменен.
( -1 фактически является аргументом по умолчанию, поэтому list.pop может использоваться без аргумента индекса):
Только это, если
- вы знаете, что в списке есть элементы в нем или готовы обрабатывать исключение, если оно пустое, и
- вы намерены удалить последний элемент из списка, рассматривая его как стек.
Это допустимые прецеденты, но не очень распространенные.
Сохранение остальной части реверса для последующего использования:
Я не знаю, почему вы это сделали, но для полноты, поскольку reversed возвращает iterator (который поддерживает протокол итератора), вы можете передать его результат в next :
Так как это делает обратное:
Но я не могу придумать вескую причину для этого, если позже вам не понадобится остальная часть обратного итератора, которая, вероятно, будет выглядеть примерно так:
Как узнать последний символ строки в списке?
Подскажите, пожалуйста, как узнать последний символ определенной строки списка. Например, дан список list = ["aaab","aade","abez"] Как вывести последний символ элемента list[0] , чтобы получилось b То есть мне нужна конструкция по аналогии с Java list[0].charAt(list[0].length()-1)
Отслеживать
задан 22 окт 2019 в 20:06
144 1 1 золотой знак 1 1 серебряный знак 11 11 бронзовых знаков
так: list[0][-1] . PS не используйте зарезервированные слова в качестве имен переменных - после этого вы не сможете восполоьзоваться конструктором list() .
22 окт 2019 в 20:09
Да, list я использовал для примера. Спасибо большое за ответ, пробовал подобный вариант но с -1 не рассмотрел, затупил. А ради интереса, возможно как-то взять элемент отличный от 0 или -1? Ну например из середины
22 окт 2019 в 20:10
Вы можете выбрать любой элемент из списка в диапазоне: [0, len(list_)-1]
22 окт 2019 в 20:17
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Самый простой и красивый способ -- обращение по отрицательному индексу, который помогает получать элементы в обратном порядке:
- -1 -- последний элемент
- -2 -- предпоследний элемент
- .
items = ["aaab", "aade", "abez"] print(items[0][-1]) # b print(items[0][len(items[0]) - 1]) # b for x in items: print(x, x[-1], x[-2], x[-3], x[-4], sep=' | ') # aaab | b | a | a | a # aade | e | d | a | a # abez | z | e | b | a