Использование форматирования строк Python со списками


112

Я sсоздаю строку в Python 2.6.5, которая будет иметь различное количество %sтокенов, которые соответствуют количеству записей в списке x. Мне нужно написать форматированную строку. Следующее не работает, но указывает на то, что я пытаюсь сделать. В этом примере есть три %sтокена, а в списке три записи.

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

Я бы хотел, чтобы строка вывода была:

1 BLAH 2 FOO 3 BAR

Ответы:


112
print s % tuple(x)

вместо того

print s % (x)

5
(x)то же самое, что и x. Помещение одного токена в скобки не имеет смысла в Python. Обычно вы вставляете скобки, foo = (bar, )чтобы было легче читать, но делаете то foo = bar,же самое.
Patrys

11
print s % (x)это то, что написал OP, я просто цитировал его / ее.
инфракрасный,

Я просто давал подсказку по языку, а не критиковал ваш ответ (на самом деле я поставил ему +1). Вы тоже не писали foo = (bar, ):)
patrys

2
Я использую (x)обозначения для ясности; это также позволяет избежать того, чтобы забыть о скобках, если вы позже добавите дополнительные переменные.
SabreWolfy

Как насчет того, чтобы получить переменные из нескольких списков? tuple принимает только один список, а средство форматирования, кажется, принимает только один кортеж
errant.info

150

Вам следует взглянуть на метод форматирования python. Затем вы можете определить свою строку форматирования следующим образом:

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
>>> x = ['1', '2', '3']
>>> print s.format(*x)
'1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'

1
Проблема OP не в методе, а в формате параметров. %оператор только распаковывает кортежи.
Patrys

Это sусложнило бы построение , так как мне нужно было бы включать увеличивающиеся числа, а не просто %sдля каждой позиции. sсоздается в несколько этапов, поэтому намного проще просто включить %sтокен.
SabreWolfy

2
@SabreWolfy Если вы строите его precedurally , то вы можете найти его проще назвать свои заполнители и использовать Dict для форматирования результирующей строки: print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
Patrys

2
@SabreWolfy: в Python 2.7 вы можете опустить номера полей:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
Приостановлено до дальнейшего уведомления.

Этот ответ потенциально сбивает с толку, так как кажется, что числовые значения 0, 1 и 2 каким-то образом связаны с количеством появлений слова «BLAH».
SabreWolfy

31

Следуя этой странице ресурсов , если длина x меняется, мы можем использовать:

', '.join(['%.2f']*len(x))

для создания заполнителя для каждого элемента из списка x. Вот пример:

x = [1/3.0, 1/6.0, 0.678]
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
print s
>>> elements in the list are [0.33, 0.17, 0.68]

1
Ссылка теперь мертва.
MK Hunter

19

Вот один лайнер. Небольшой импровизированный ответ с использованием формата с print () для перебора списка.

Как насчет этого (python 3.x):

sample_list = ['cat', 'dog', 'bunny', 'pig']
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))

Прочтите здесь документацию по использованию format () .


18

Поскольку я только что узнал об этой классной штуке (индексация списков из строки формата), я добавляю к этому старому вопросу.

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
x = ['1', '2', '3']
print (s.format (x=x))

Вывод:

1 BLAH 2 FOO 3 BAR

Однако я до сих пор не понял, как сделать нарезку (внутри строки формата '"{x[2:4]}".format...), и хотел бы понять это, если у кого-то есть идея, однако я подозреваю, что вы просто не можете этого сделать.


Мне немного интересно узнать о вашем варианте использования нарезки.
Майкл

1
у меня на самом деле нет ... Думаю, я просто подумал, что было бы здорово иметь возможность это сделать
Джоран Бизли

11

Это был забавный вопрос! Другой способ справиться с этим для списков переменной длины - создать функцию, которая полностью использует преимущества .formatметода и распаковки списка. В следующем примере я не использую необычное форматирование, но его можно легко изменить в соответствии с вашими потребностями.

list_1 = [1,2,3,4,5,6]
list_2 = [1,2,3,4,5,6,7,8]

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    return s.format(*alist)

# Example output:
>>>ListToFormattedString(list_1)
'  1,  2,  3,  4,  5,  6'
>>>ListToFormattedString(list_2)
'  1,  2,  3,  4,  5,  6,  7,  8'

3

То же, что и ответ @neobot, но немного более современный и лаконичный.

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.