Последний элемент
Напишите функцию, которая будет принимать список и проверять, является ли последний элемент в списке результатом конкатенации всех остальных. Список никогда не будет пустым.
Примеры
match_last_item(["rsq", "6hi", "g", "rsq6hig"]) ➞ True match_last_item([1, 1, 1, "11"]) ➞ False # Последний элемент должен быть "111" match_last_item([8, "thunder", True, "8thunderTrue"]) ➞ True
Варианты решения
def match_last_item(lst): return ''.join(map(str, lst[:-1])) == lst[-1]
def match_last_item(lst): return ''.join(str(i) for i in lst[:-1]) == lst[-1]
match_last_item = lambda r: r.pop() == ''.join(map(str, r))
Как определить конец списка в python?
Как только list[i] становится последним элементом списка, list[i + 1] выдает ошибку (я по незнанию ожидал None ). Как в Python определить конец списка?
Отслеживать
задан 28 мая 2019 в 9:52
19 1 1 серебряный знак 6 6 бронзовых знаков
if i == len(list) — 1 очевидно
28 мая 2019 в 9:53
@andreymal не совсем понимаю как это должно работать
28 мая 2019 в 9:56
Длина списка к примеру 10, элементы нумеруются с нуля, первый элемент это 0, второй это 1, соответственно последний десятый это len(list)-1 → 10-1 → 9
28 мая 2019 в 9:57
Доступ к последнему элементу списка возможен как some_list[-1]
– user247581
28 мая 2019 в 11:41
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Очень просто. Делать цикл не до последнего элемента, а до предпоследнего:
for i in range(len(list)-1):
PS. Не нужно называть список словом list . Это встроенная функция.
Отслеживать
ответ дан 28 мая 2019 в 10:00
25.9k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков
В данном случае мне нужен последний элемент — те отбрасывать нужно на уровне условия if.
28 мая 2019 в 10:02
Не понял. list[i+1] в вашем коде даст вам последний элемент.
28 мая 2019 в 10:03
Если Вы пишете цикл по индексам, Вы еще не освоили python 🙂
a = (2,4,2,5,7) for m, n in zip(a[:-1], a[1:]): print (m, n)
P.S. Если по результатом надо сформировать новый список, то вместо цикла for часто используют генераторы списков.
Отслеживать
ответ дан 28 мая 2019 в 14:07
Alex Titov Alex Titov
1,215 7 7 серебряных знаков 8 8 бронзовых знаков
t = [0,1,2,3,4,5,6,7,8] for pos, i in enumerate(range(0,len(t)) ): if pos == len(t) - 1: print('Последний элемент', i) else: pass # Вывод # Последний элемент 8
Отслеживать
ответ дан 30 июл 2019 в 21:18
587 2 2 серебряных знака 12 12 бронзовых знаков
- python
- python-3.x
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как найти последний максимальный элемент в list?
Необходимо найти наибольшее значение в списке и индекс последнего элемента, который имеет данное значение за один проход по списку, не модифицируя этот список и не используя дополнительного списка.
Например:
ввод 1 2 3
вывод 3 2
ввод 1 2 1 2 1
вывод 2 3
ввод 1 2 3 4 5
вывод 5 4
ввод 1 1 1 1 1
вывод 1 4
l = list(map(int, input().split())) n = 0 f = 0 for x in range(len(l)): if x > l[n]: n += 1 print(l[n], n)
def func(array): n = 0 for i in range(len(array)): if array[i] >n: n = array[i] ind = i elif array[i] == n: ind += 1 else: pass print(n, index) if __name__=='__main__': func(list(map(int, input().split())))
- Вопрос задан более трёх лет назад
- 5758 просмотров
8 комментариев
Простой 8 комментариев
print(max(lst), lst.index(max(lst)))
Александр @fireSparrow
javedimka, Во-первых, здесь два прохода по списку. Во-вторых, index найдёт первый элемент с таким значением, а не последний.
dmitrylogvinov @dmitrylogvinov Автор вопроса
javedimka, увы, но нет
я не понял, а чем тебе твои примеры не подходят? в первом только исправить
if x >= l[n]:
dmitrylogvinov @dmitrylogvinov Автор вопроса
Дмитрий Зайцев, тоже не работает.Попробуй 1 2 1 2 1 или 10 10 10
Александр, циклов for/in не вижу, и если уж так смотреть, то в своих примерах автор тоже два раза по списку проходится, а второе условие я не понял, потому что примеры не читал до этого момента.
l = list(map(int, input().split()))
max = l[0]
coun = 0
for x in range(len(l)):
if l[x]>=max:
max=x
dmitrylogvinov,
print(max(s), ».join(str(x) for x in s).rindex(str(max(s))))
Решения вопроса 2

Andrey Dugin @adugin Куратор тега Python
dmitrylogvinov, Вы в корне неправильно подходите к обучению. Вам нужно больше времени проводить с учебником и изучать стандартные библиотеки (и в первую очередь — встроенные функции, обращая особое внимание на их параметры), а не пытаться решать задачи «в лоб», раз за разом городя конструкции в стиле Delphi из базового синтаксиса, примерно одинакового для каждого языка. «Батарейки» в Python присутствуют как раз для того, чтобы не изобретать велосипеды.
Задача решается просто и элегантно:
from itertools import count def lastmax(*sequence): return max(zip(sequence, count())) assert lastmax(1, 2, 3) == (3, 2) assert lastmax(1, 2, 1, 2, 1) == (2, 3) assert lastmax(1, 2, 3, 4, 5) == (5, 4) assert lastmax(1, 1, 1, 1, 1) == (1, 4)
Те же самое, но без itertools:
def lastmax(*sequence): return max(zip(sequence, range(len(sequence))))
Ещё вариант:
from operator import itemgetter def lastmax(*sequence): return max(enumerate(sequence), key=itemgetter(1, 0))[::-1]
def lastmax(*sequence): return max(.items())
Есть и ещё несколько более эзотерических вариантов — например, через heapq.
Ответ написан более трёх лет назад
Комментировать
Нравится 8 Комментировать
Александр @fireSparrow
Создаёте две промежуточные переменные. В одной будет лежать текущий максимум, во второй — индекс последнего текущего максимума.
После этого идёте циклом по списку и сравниваете каждый элемент с текущим максимумом.
Если элемент меньше текущего максимума — он нам не интересен, идёте дальше.
Если элемент больше или равен текущего максимума, то значение этого элемента записываете в качестве нового максимума, а его индекс — в переменную для индекса.
Где можно обращаться к предпоследнему элементу списка как 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 и так далее, либо целое выражение. Нет?
