Форматирование строк в Python

Это очень распространенная проблема, возникающая из-за непонимания работы :nth-child() и :nth-of-type(). К сожалению, в настоящее время нет решения на основе селектора, поскольку селектор не обеспечивает способ сопоставления n-го дочернего элемента, который соответствует произвольному селектору на основе шаблона, такого как нечетные, четные или любые an+b, где a != 1 и b != 0.

:nth-child() псевдокласса подсчитывает элементы среди всех всех их братьев и сестер под одним и тем же родителем. Он не учитывает только братьев и сестер, которые соответствуют остальной части селектора. Аналогично, псевдо-класс :nth-of-type() считает, что siblings используют один и тот же тип элемента, который относится к имени тега в HTML, а не к остальной части селектора.

Это также означает, что если все дочерние элементы одного и того же родителя имеют один и тот же тип элемента, например, в случае тела таблицы, единственными дочерними элементами которого являются tr или элемент списка, единственными дочерними элементами которого являются li, тогда :nth-child() и :nth-of-type() будут вести себя одинаково, т. е. для каждого значения an+b, :nth-child(an+b) и :nth-of-type(an+b) будут соответствовать одному и тому же набору элементов.

На самом деле все простые селектора в данном соединении селектор, включая псевдоклассы, такие как :nth-child() и :not(), работают независимо друг от друга , вместо того, чтобы смотреть на подмножество элементов, которые сопоставляются остальными селектора.

Это также подразумевает, что нет понятия порядка среди простых селекторов в каждом отдельном селекторе 1, что означает, например, следующие два селектора эквивалентны:

[f 1]

При переводе на английский язык оба означают:

Выберите любой элемент tr, который соответствует всем следующим независимым условиям:

  • нечетный номер родительского родителя;
  • имеет класс «строка»; и
  • является потомком элемента table, который имеет класс «myClass».
blockquote>

(вы заметите, что мое использование неупорядоченный список здесь, просто для того, чтобы управлять точкой.)

Поскольку в настоящее время нет чистого решения CSS, вам придется использовать скрипт для фильтрации элементов и соответственно применять стили или дополнительные имена классов. Например, следующее обходное решение, использующее jQuery (предполагается, что в таблице есть только одна группа строк, заполненная элементами tr):

$('table.myClass').each(function() {
  // Note that, confusingly, jQuery's filter pseudos are 0-indexed
  // while CSS :nth-child() is 1-indexed
  $('tr.row:even').addClass('odd');
});

С соответствующим CSS:

table.myClass tr.row.odd {
  ...
}

Если вы используете автоматические инструменты тестирования, такие как Selenium или обрабатываете HTML с помощью таких инструментов, как lxml, многие из этих инструментов позволяют XPath в качестве альтернативы:

//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]

Другие решения, использующие разные технологии, оставил в качестве упражнения читателю; это всего лишь краткий, надуманный пример для иллюстрации.


Для чего это стоит, есть предложение для расширения к :nth-child() нотации , которое должно быть добавлено к Селекторы уровня 4 для конкретной цели выбора каждого n-го дочернего элемента, соответствующего данному селектору.2

Селектор, в котором для фильтрации совпадений предоставляется в качестве аргумента :nth-child(), снова из-за того, как селектора работают независимо от друг друга в последовательности, продиктованной существующим синтаксисом селектора. Итак, в вашем случае это будет выглядеть так:

table.myClass tr:nth-child(odd of .row)

(Проницательный читатель сразу заметит, что это должно быть :nth-child(odd of tr.row) вместо этого, поскольку простые селектор tr и :nth-child() работают независимо друг от друга. Это одна из проблем с функциональными псевдоклассами, которые принимают селекторы, банку червей, которую я предпочитаю не открывать посреди этого ответа. Вместо этого я собираюсь перейти к предположению что большинство сайтов не будут иметь каких-либо других элементов, кроме элементов tr, как братьев и сестер друг друга в теле таблицы, что сделает любой вариант функционально эквивалентным.)

Конечно, будучи новым предложением в новая спецификация, это, вероятно, не увидит реализацию до нескольких лет в будущем. В то же время вам придется придерживаться сценария, как указано выше.


1 Если вы укажете тип или универсальный селектор, он должен быть первым. Однако это не меняет того, как работают селекторы. это не что иное, как синтаксический приступ.

2 Первоначально это было предложено как :nth-match(), однако, поскольку оно по-прежнему считает элемент относительным только для его братьев и сестер, а не для каждого другого элемента, который соответствует данному селектору, он с тех пор, как с 2014 года был перепрофилирован как расширение существующего :nth-child().

29
задан Mateusz Piotrowski 7 March 2017 в 00:59
поделиться

10 ответов

В предыдущих ответах использовалось форматирование%, которое постепенно прекращается в Python 3.0+. Предполагая, что вы используете Python 2.6+, здесь описана более перспективная система форматирования:

http://docs.python.org/library/string.html#formatstrings

Хотя есть и более продвинутые функции, простейшая форма выглядит очень близко к тому, что вы написали:

>>> "[{0}, {1}, {2}]".format(1, 2, 3)
[1, 2, 3]
59
ответ дан DNS 7 March 2017 в 00:59
поделиться

Вы можете сделать это тремя способами:


Использовать автоматическую красивую печать Python:

print [1, 2, 3]   # Prints [1, 2, 3]

Показывать то же самое с помощью переменной:

numberList = [1, 2]
numberList.append(3)
print numberList   # Prints [1, 2, 3]

Используйте «классические» подстановки строк (ala C's printf). Обратите внимание на различные значения здесь% в качестве спецификатора формата строки и%, чтобы применить список (фактически кортеж) к строке форматирования. (И обратите внимание, что% используется как оператор по модулю (остаток) для арифметических выражений.)

print "[%i, %i, %i]" % (1, 2, 3)

Обратите внимание, что если мы используем предопределенную переменную, нам нужно превратить ее в кортеж, чтобы сделать this:

print "[%i, %i, %i]" % tuple(numberList)

Использовать форматирование строки Python 3. Это все еще доступно в более ранних версиях (начиная с версии 2.6), но это «новый» способ сделать это в Py 3. Обратите внимание, что вы можете использовать позиционные (порядковые) аргументы или именованные аргументы (во всяком случае, я поставил) они в обратном порядке.

print "[{0}, {1}, {2}]".format(1, 2, 3)

Обратите внимание, что имена «один», «два» и «три» могут быть любыми.)

print "[{one}, {two}, {three}]".format(three=3, two=2, one=1)
27
ответ дан 2 revs, 2 users 99% 7 March 2017 в 00:59
поделиться

Для печати элементов последовательно используйте {} без указания индекса

print('[{},{},{}]'.format(1,2,3))

(работает с python 2.7 и python 3.1)

5
ответ дан Riccardo Galli 7 March 2017 в 00:59
поделиться

Вы сформулировали себя не очень похвально, но я рискну предположить, что это то, что вы ищете:

foo = "Hello"
bar = "world"
baz = 2
print "%s, %s number %d" % (foo, bar, baz)
2
ответ дан JosefAssad 7 March 2017 в 00:59
поделиться

Вы ищете форматирование строки, которое в Python основано на функции sprintf в C.

print "[%s, %s, %s]" % (1, 2, 3)

Для получения полной ссылки смотрите здесь: http://docs.python.org/library/stdtypes.html#string-formatting

18
ответ дан Ram Narasimhan 7 March 2017 в 00:59
поделиться

Я думаю, что эта комбинация отсутствует: P

"[{0}, {1}, {2}]".format(*[1, 2, 3])
1
ответ дан radeklos 7 March 2017 в 00:59
поделиться

У вас есть много решений:)

простой способ (в стиле C) :

print("[%i, %i, %i]" %(1, 2, 3))

Используйте str.format ( )

print("[{0}, {1}, {2}]", 1, 2, 3)

Использовать str.Template ()

s = Template('[$a, $b, $c]')
print(s.substitute(a = 1, b = 2, c = 3))

Вы можете прочитать PEP 3101 - Расширенное форматирование строк

1
ответ дан RaminNietzsche 7 March 2017 в 00:59
поделиться

PEP 498, который приземлился в python 3.6, добавил интерполяцию буквенных строк, которая в основном является сокращенной формой format.

Теперь вы можете делать:

f"[{1}, {2}, {3}]"

Распространенными другими видами использования, которые я считаю полезными, являются:

pi = 3.141592653589793
today = datetime(year=2018, month=2, day=3)

num_2 = 2     # Drop assigned values in
num_3 = "3"   # Call repr(), or it's shortened form !r
padding = 5   # Control prefix padding
precision = 3 #   and precision for printing


f"""[{1},
     {num_2},
     {num_3!r},
     {pi:{padding}.{precision}},
     {today:%B %d, %Y}]"""

, которые будут производить:

"[1,\n     2,\n     '3',\n      3.14,\n     February 03, 2018]"
1
ответ дан toofarsideways 7 March 2017 в 00:59
поделиться

Если вы не знаете, сколько элементов в списке, этот подход является наиболее универсальным

>>> '[{0}]'.format(', '.join([str(i) for i in [1,2,3]]))

'[1, 2, 3]'

Он гораздо проще для списка строк

>>> '[{0}]'.format(', '.join(['a','b','c']))
'[a, b, c]'
0
ответ дан Yupa 7 March 2017 в 00:59
поделиться

Очень короткий ответ.

пример: печать (" {:05.2f} ".format (2.5163)) возвращается 02.51

  • {} Набор сюда Переменная
  • : Начните Разрабатывать
  • , 0 продвижения с обнуляет", "ведущий с пробелами
  • 5 ДЛИНА ПОЛНОЙ СТРОКИ (Количества точки, 00.00 len 5 не 4)
  • .2 две цифры после точки, с округлением.
  • f для плаваний
0
ответ дан 27 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: