Как интерполировать список в 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