Как обратиться к предпоследнему элементу в css
Перейти к содержимому

Как обратиться к предпоследнему элементу в css

  • автор:

Где можно обращаться к предпоследнему элементу списка как 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 и так далее, либо целое выражение. Нет?

Выбор предпоследнего div в CSS: селектор nth-last-child()

Для выбора предпоследнего элемента используйте псевдокласс :nth-last-child(2) :

Скопировать код

:nth-last-child(2) < /* Стили для предпоследнего элемента */ >

Данный CSS-селектор служит для воздействия на предпоследний дочерний элемент внутри его родителя. Он является аналогом команды отмены ctrl + z для предпоследнего изменения.

Подробнее: понимание :nth-last-child(n)

Как работает :nth-last-child(n)

Давайте разберемся в деталях. Псевдокласс :nth-last-child(n) предоставляет возможность указать на элемент по номеру, ведя отсчет с конца. Значение «n» в данном контексте равно 2, что обозначает, что мы нацеливаемся на предпоследний элемент среди его братьев и сестер.

Совместимость :nth-last-child(2) с браузерами

При использовании этого селектора не возникает проблем — он поддерживается всеми современными браузерами, включая IE9. Тем не менее, для более старых версий Internet Explorer рекомендуется проверять совместимость.

Пример использования :nth-last-child(2) в CSS

Применение :nth-last-child(2) довольно просто и удобно. Отметьте предпоследний элемент на странице следующим образом:

Как обратиться к первому по парядку блоку div?

Author24 — интернет-сервис помощи студентам

как можно достучатся к первому блоку с классом myclass, но не задев второй. и на оборот, как ко второму но не задев первый. Или это вообще не возможно?

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как обратиться к блоку, не используя ById и ClassName
Привет, нужно убрать id с кнопок, та и не только с кнопок, но я к ним таким образом обращался.

Как обратиться к блоку, который в поле видимости?
Здравствуйте. Хочу реализовать появление блоков при прокрутке через GSAP. Подскажите, как можно.

Как обратиться к DIV-ам, размещенным внутри DIV-а как к единому целому?
Есть див в котором много других дивов. Как обратиться к тем дивам что внутри дива как к единому.

562 / 339 / 87
Регистрация: 15.05.2013
Сообщений: 812
Записей в блоге: 1

1 2 3 4 5 6 7 8 9 10 11
.myclass:first-child{ } .myclass:last-child{ } .myclass:nth-child(1){ } .myclass:nth-child(2){ }

Что больше душе угодно.)
632 / 440 / 67
Регистрация: 19.09.2012
Сообщений: 1,632

div.myclass:first-child{color:red} div.myclass:last-child{color:blue}
div#block div{color:red} div#block div+div{color:blue}

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как растянуть фон картинку по блоку DIV
Здравствуйте! Есть такая проблемка. Например блок DIV в ширину на 100% экрана, а в высоту 300.

Как назначить свойства блоку div через свойство SetAttribute?
Здравствуйте, уважаемые форумчане! Обращаюсь сюда, потому что возникла проблема: не получается.

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

Как обратиться к первому и последнему элементу в строчке в двумерном массиве
День Добрый. Не могу понять как обратиться к первому и последнему элементу в строчке в двумерном.

Или воспользуйтесь поиском по форуму:

Как в css3 применить стиль последнему элементу в DOM?

Есть два элемента, как применить псевдокласс :last-child к классу ‘el’ и задать стиль второму элементу?

  • Вопрос задан более трёх лет назад
  • 634 просмотра

Комментировать
Решения вопроса 2

hzzzzl

Ответ написан более трёх лет назад
Levkas @Levkas Автор вопроса

Так то оно так, но у меня почему-то два элемента принимают стиль.
Может все из-за того, что элементы динамически добавляются?

hzzzzl

Levkas, да не, стили применяются еще раз при перерисовке, вот как здесь
https://codepen.io/anon/pen/JzpEpY
думаю у тебя где-то в css в селекторе ошибка, попробуй по странице поискать в консоли типа document.querySelector(‘.el:last-child’) — браузер найдет именно тот элемент, который надо, или другой?

Levkas @Levkas Автор вопроса

hzzzzl, ,недосмотрел то, что эти элементы были вложены еще в разные элементы и поэтому ласт-чилд применялся к обоим)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *