Как интерполировать список в f-строку в Python?
Скажем, у меня есть функция
def foo(): return [1, 2, 3]
Я хочу интерполировать результат функции в строку, чтобы получить "001 002 003"
. Я пробовал это:
f"{*foo():03d 03d 03d}"
Но он произвел SyntaxError: can't use starred expression here
. Могу ли я сделать это, используя f-строку?
Ответы
Ответ 1
это то, что вы ищете?
str_repr = ' '.join(map('{:03d}'.format, foo()))
print(str_repr) # prints: 001 002 003
возможно, самое лучшее в этом решении состоит в том, что он работает с любой длиной списка и с минимальной настройкой вы также можете изменить выходной формат.
Ответ 2
Во-первых, *
-оператор может только распаковывать итерации в нескольких конкретных контекстах, таких как вызов функции, отображение списка и т.д. Его нельзя использовать непосредственно в заполнителе f-строки. Хотя, вы можете использовать str.format()
следующим образом:
"{:03d} {:03d} {:03d}".format(*foo())
Во-вторых, вы не можете в целом форматировать/интерполировать несколько значений в одном заполнителе. Для каждого значения необходимо использовать отдельный заполнитель:
lst = foo()
f"{lst[0]:03d} {lst[1]:03d} {lst[2]:03d}"
Ответ 3
Оператор *
(аналогичные правила существуют для **
) может использоваться только внутри:
- вызов функции:
foo(*bar)
- список, кортеж или набор литералов:
['foo', *bar]
- назначение:
foo, *bar = range(10)
Это не expression и поэтому не может использоваться внутри скобок f-строк.
Ответ 4
Для списков f-строки, похоже, не добавляют к тому, что было возможно без них. Альтернативное, немного более простое решение без f-строк и без .join
, которое работает для любой длины списка, следующее
a = foo()
str_repr = ("{:03d} "*len(a)).format(*a)
print(str_repr) # prints: 001 002 003