Використання Python String Formatting зі списків


111

Я будую рядок 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)це те, що написав ОП, я просто цитував його / її.
інфрачервоний

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

2
Я використовую (x)позначення для ясності; це також дозволяє уникнути забуття дужок, якщо згодом ви додасте додаткові змінні.
SabreWolfy

Як щодо того, якщо ви хочете джерела змінних з кількох списків? кортеж займає лише один список, а формат, здається, бере лише один кортеж
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
Проблема ОП - це не метод, а формат параметрів. %оператор розпаковує лише кортежі.
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

Дотримуючись цієї сторінки ресурсів , якщо довжина х змінюється, ми можемо використовувати:

', '.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
Посилання зараз мертве.
МК Хантер

19

Ось один лайнер. Трохи імпровізована відповідь, використовуючи формат з print () для повторення списку.

Як щодо цього (python 3.x):

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

Прочитайте тут документи про використання формату () .


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
у мене насправді немає такого ... я думаю, що я просто думав, що це буде охайно, щоб мати можливість
Joran Beasley

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'

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

Вихід є

1 BLAH 2 FOO 3 BAR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.