Вывести последний элемент списка
Доброго времени суток ,есть набор цифр , он суммируется , и нужно вывести результат , цифры хранятся в словаре :
a=0 for line in ["5", "5", "5", "5", "5", "5"]: a = a + int(line) print(a)
то что я наваял вполне работает , но есть одно НО , нужно из этого всего вывести только число 30 а не все что он плюсует , прогу вашей помощи,ибо не хватает что то мне опыта )))
echo_
22.05.17 16:25:40 MSK
sum(int(v) for v in ("5", "5", "5", "5", "5", "5"))
fang90 ★★★★★
( 22.05.17 16:28:23 MSK )
У тебя a печатается на каждой итерации цикла for. А надо только после того как цикл завершится. Просто вытащи print(a) из тела цикла
MrClon ★★★★★
( 22.05.17 16:31:22 MSK )
Последнее исправление: MrClon 22.05.17 16:31:50 MSK (всего исправлений: 1)
Не приходи с такими вопросами, здесь не детский сад.
a=0 for line in ["5", "5", "5", "5", "5", "5"]: a = a + int(line) else: print(a)
Virtuos86 ★★★★★
( 22.05.17 16:43:57 MSK )
Ответ на: комментарий от Virtuos86 22.05.17 16:43:57 MSK
А зачем здесь else?
Davidov ★★★★
( 22.05.17 16:49:48 MSK )
Ответ на: комментарий от Davidov 22.05.17 16:49:48 MSK
Чтобы принт не сработал без цикла случайно.
То есть незачем.
Goury ★★★★★
( 22.05.17 17:01:31 MSK )
Ответ на: комментарий от Virtuos86 22.05.17 16:43:57 MSK
Не приходи с такими ответами, здесь тебе не это.
kukuruku ★★
( 22.05.17 18:00:27 MSK )
Я конкретно затупил(((((((
ваши примеры очень отличные, но не учел одного момент , и это печально , смотрите : задача была такая , я в цикле из файла извлекаю цифры , и добавляю их в список , в итоге получается что то такое :
в итоге я снова перебирал это через фор , с надеждой то я это смогу суммировать , но оказалось что нет (, в чем я затупил , как исправить подскажите ?
echo_
( 22.05.17 18:41:01 MSK ) автор топика
Ответ на: комментарий от Virtuos86 22.05.17 16:43:57 MSK
Не приходи с такими вопросами, здесь не детский сад.
Да, конечно сад просто недетский:
Из серии погуглите за меня.
anonymous
( 22.05.17 18:49:07 MSK )
Deleted
( 22.05.17 18:58:23 MSK )
Последнее исправление: merhalak 22.05.17 19:04:33 MSK (всего исправлений: 1)
Ответ на: комментарий от Davidov 22.05.17 16:49:48 MSK
Чтобы логически связать print(a) с циклом. Потому что по смыслу это всё единый блок кода. И нет, если просто написать принт после цикла без ветки else, то единый блок кода будет существовать только в твоей голове, а так мы указываем это средствами ЯП.
Virtuos86 ★★★★★
( 22.05.17 19:04:26 MSK )
Ответ на: комментарий от anonymous 22.05.17 18:49:07 MSK
Ну так я погуглил. Но сначала я гуглил в уяндексе, а потом в гугле. Первый не помог, второй помог. Ты лучше обрати свой сарказм в сторону ОП, которому «опыта» не хватает осилить, как работает цикл.
Virtuos86 ★★★★★
( 22.05.17 19:09:09 MSK )
Ответ на: комментарий от Virtuos86 22.05.17 19:04:26 MSK
Жуть какая. for-else — синтаксический костыль. Для логических связей последовательности действий есть функции.
staseg ★★★★★
( 22.05.17 19:25:09 MSK )
Ответ на: комментарий от staseg 22.05.17 19:25:09 MSK
Есть еще и while-else :-).
Для логических связей последовательности действий есть функции.
Функция не спасёт. Поясняю. Есть код:
a=0 for line in ["5", "5", "5", "5", "5", "5"]: a = a + int(line) print(a)
Далее добавляются некоторые другие строки:
a=0 for line in ["5", "5", "5", "5", "5", "5"]: a = a + int(line) a = a*a . print(a)
print(a) также печатает a , но изначально печаталось содержимое переменной после цикла, а теперь переменная еще раз изменилась, то есть поменялся смысл строки кода, потому что изменился мир. Если же print(a) находится в ветке else, такого не произойдет, потому что даже постороннему человеку визуально видно, что строка относится к циклу, и ее не нужно отрывать от него. Такая фича, прямо скажем, нужна не часто, но иногда удобна.
Virtuos86 ★★★★★
( 22.05.17 19:45:39 MSK )
Еще бы неплохо подразобраться со структурами данных. Например 5 это число, а «5» это строка. Зачем ты хранишь строки и переводишь их в числа?
А еще то что ты назвал словарем на самом деле является списком.
redixin ★★★★
( 22.05.17 19:55:54 MSK )
Ответ на: комментарий от redixin 22.05.17 19:55:54 MSK
Он пояснил, что читает файл построчно.
А еще то что ты назвал словарем на самом деле является списком.
А в действительности это массив и не имеет отношения к структуре данных «список».
Virtuos86 ★★★★★
( 22.05.17 20:04:14 MSK )
Ответ на: комментарий от Virtuos86 22.05.17 20:04:14 MSK
Ну, технически это всё таки список. Массивы — структуры неизменяемые.
Как вывести последний символ элемента списка в Питоне [закрыт]
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.
Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.
Закрыт 3 года назад .
Как вывести последний символ элемента списка в Питоне
Где можно обращаться к предпоследнему элементу списка как 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 и так далее, либо целое выражение. Нет?
Способы извлечения 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
- Эффективное использование генераторов списков
- Операция присваивания на месте и списки
- Поведение списков Python в разных областях видимости
- Сравнение и идентичность двух списков
- Как получить несколько последних элементов списка