Как интерполировать список в F-строку в Python?

Скажи у меня есть функция

def foo(): return [1, 2, 3]

Я хочу интерполировать результат функции в строку, чтобы получить "001 002 003", Я пробовал это:

f"{*foo():03d 03d 03d}"

Но это произвело SyntaxError: can't use starred expression here, Могу ли я сделать это, используя F-строку?

4 ответа

Это то, что вы ищите?

str_repr = ' '.join(map('{:03d}'.format, foo()))
print(str_repr)  # prints: 001 002 003

возможно, лучшее в этом решении то, что оно работает с любой длиной списка, и с минимальной настройкой вы также можете изменить формат вывода.

Во-первых, *-operator может распаковывать итерации только в нескольких конкретных контекстах, таких как вызов функции, отображение списка и т. д. Его нельзя использовать непосредственно в заполнителе f-строки. Хотя, вы могли бы использовать str.format() как это:

"{:03d} {:03d} {:03d}".format(*foo())

Во-вторых, вы не можете обычно форматировать / интерполировать несколько значений в одном заполнителе. Вам нужно будет использовать отдельный заполнитель для каждого значения:

lst = foo()
f"{lst[0]:03d} {lst[1]:03d} {lst[2]:03d}"

* оператор (аналогичные правила существуют для **) можно использовать только внутри:

  • вызов функции: foo(*bar)
  • список, кортеж или набор букв: ['foo', *bar]
  • назначение: foo, *bar = range(10)

Это не выражение и поэтому не может использоваться внутри скобок f-строк.

Вы также можете использовать метод zfill:

s_repr=" ".join([str(x).zfill(3) for x in foo()]) #not very PEP8 =S

Для списков f-строки, кажется, не добавляют много к тому, что уже было возможно без них. Альтернативное, немного более простое, решение без f-строк и без .join, который работает для любой длины списка, является следующим

a = foo()
str_repr = ("{:03d} "*len(a)).format(*a)
print(str_repr)  # prints: 001 002 003
Другие вопросы по тегам