2017-01-27 11 views
10

は私が"001 002 003"を取得するために、文字列に関数の結果を補間したいリストをPythonのf-stringに補間する方法は?

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

機能を持っていると言います。私はこれを試しました:

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

しかしそれはSyntaxError: can't use starred expression hereを作りました。 f-stringを使ってこれを行うことはできますか?

+2

'F」{」」.join(マップ({あります.format、foo()))}} "'? –

+0

提案は機能しますが、f-stringは冗長で構文は冗長です。 f-stringのない@ ev-kounisの同様の答えを使うことができます。 f-stringsはリストの印刷を改善しないようです。 – divenex

答えて

8

これはあなたが探しているものですか?

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

多分、この解決策の最良の点は、任意のリストの長さで機能し、最小限の調整で出力形式も変更できることです。

+0

これはうまくいきますが、要求どおりにf-stringsを使用しません**。確かに利用可能な最良のPythonソリューションかもしれませんが、冗長です。私はこの 'f" {foo():03d} ''のようなものがリストの上にスレッドしたいと思う。 – divenex

3

最初に、*オペレータは、関数呼び出し、リスト表示などの特定のコンテキストでのみ、反復可能なものをアンパックすることができます。これはf文字列のプレースホルダでは直接使用できません。あなたはこのようなstr.format()使用することができ、が:第二

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

を、あなたは一般的なフォーマット/単一プレースホルダに複数の値を補間することはできません。内部のみ使用することができる(同様の規則が**ために存在する)

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

"*演算子は、関数呼び出しでiterablesをアンパックするだけです。"それは本当ではありません: '[1,3、* foo()]'は動作します。 – L3viathan

+0

* "1つのプレースホルダに複数の値を書式化/補間することはできません" *関数として 'map'と' {} .format'を使用するとどちらもありません –

+0

@ L3viathan:良い点が更新されました。 –

1

*演算子:あなたは値ごとに別々のプレースホルダを使用する必要があるだろう

  • 関数呼び出し:foo(*bar)
  • リスト、タプル、またはセットリテラル:['foo', *bar]
  • 割り当て:foo, *bar = range(10)

expressionではないため、f-stringの中かっこ内で使用することはできません。

0

リストの場合、f-stringsはそれがなければすでに可能だったものにあまり追加していないようです。 03D} ':任意のリストの長さのために働く F-ストリング無しと.joinことなく代替、わずかに単純、溶液は、以下

a = foo() 
str_repr = ("{:03d} "*len(a)).format(*a) 
print(str_repr) # prints: 001 002 003 
関連する問題