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