web-dev-qa-db-ja.com

ブレース抑制付きのリストをアンパックするためのf文字列構文

新しいf-string形式を使用して、いくつかの文字列形式オプションを調べています。私は定期的にリストや長さが不明な他のイテラブルをアンパックする必要があります。現在、私は以下を使用しています...

_>>> a = [1, 'a', 3, 'b']
>>> ("unpack a list: " + " {} "*len(a)).format(*a)
'unpack a list:  1  a  3  b '
_

これは、少し面倒ですが、3.6より前の.format表記を使用して作業を行います。新しいf-string形式オプションは、実行時の文字列連結を考えると興味深いものです。私が問題を抱えている{}の数の複製です。前の例では、必要な構造を作成し、.format()セクション内でアンパックしました。

ただし、これを試みた結果、1つのバリアントが機能しました。

1)両方の中括弧が一緒に展開されない...

_>>> 'unpack a list'  f' {{*a}}'
'unpack a list {*a}'
_

2)内部{}ペアの周りにスペースを追加します。

これは機能しますが、開始中括弧と終了中括弧{、}はそのまま残します。

_>>> 'unpack a list'  f' { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"
_

2b)バリアントを1つのf-stringに連結する

評価は明らかに左から右に行われるため、これにより外観と構文が改善されました。ただし、これにより、中括弧が残ったままになります。

_>>> f'unpack a list { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"
_

3)_{a}_だけで自動解凍を試しました

おそらく、全体の手順を考えすぎて、何らかの形で自動解凍ができることを期待していました。これにより、中括弧が_[]_に置き換えられたリスト表現が生成されました。

_>>> f'unpack a list {a}'
"unpack a list [1, 'a', 3, 'b']"
_

上記のバリアント(2)で中括弧を抑制するには何が必要ですか、または既存の.format()メソッドを引き続き使用する必要がありますか?私はそれを単純に保ち、f-stringによって提供される新しい機能を使用し、pythonバージョンが現在快適なものより以前のものであるバージョンを超えて戻らないようにします。私は疑い始めています。そのf'strings 'は、その.format()兄弟によって提供されるものの完全なカバレッジを提供していません。エスケープエンコーディングや、 f文字列で\を使用します。PEPを読んで広く検索しましたが、明らかな点が不足しているように感じます。

数時間後に編集:

4)添え字を使用して角かっこを手動で切り取ります:str(a)[1:-2]

私は必要ないくつかのケースに役立つこのバリアントを見つけました

_f'unpack a list: {str(a)[1:-2]}'
"unpack a list: 1, 'a', 3, 'b"
_

しかし、スライシングは便宜に過ぎず、結果の周りに文字列の引用符が残ります。

16
NaN

有効なPython式はf-stringの中括弧内に allowed であるため、str.join()を使用して、必要な結果を生成できます。

>>> a = [1, 'a', 3, 'b']
>>> f'unpack a list: {" ".join(str(x) for x in a)}'
'unpack a list: 1 a 3 b'

もちろん、ヘルパー関数を作成することもできます。実際のユースケースで、上記よりも詳細にしたい場合は、次のようにします。

def unpack(s):
    return " ".join(map(str, s))  # map(), just for kicks
>>> f'unpack a list: {unpack(a)}'
'unpack a list: 1 a 3 b'
17
Zero Piraeus

これがf-Stringsの使用法であるとは思いません。よくても、次のようにprint()互換のタプルを準備することを想像できます。

mixed = [1, "list_string", 2]
number = 23
answer = 46

info = 'Content:', *mixed, f'{number} {answer}'
print(*info)  # default sep=' '

出力

Content: 1 list_string 2 23 46
1
Ernesto Herrera

単純なPythonはおそらくより明確です:

>>>  'unpack a list: ' + ' '.join(str(x) for x in a)
'unpack a list: 1 a 3 b'

スライスあり:

>>> 'unpack a list: ' + ' '.join([str(x) for x in a][1:3])
'unpack a list: a 3'
1
Gringo Suave