2017-03-13 4 views
3

新しいf-string形式を使用して、いくつかの文字列形式オプションを調べています。私は、リストや他の長さが不明なイテラブルを解凍する必要があります。現在、私は次のように使用して...ブレース抑制付きのリストを展開するための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)

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

、I内部{}のペアの周りにスペースを挿入しました。これは控えめな改善でしたが、開閉を残しました{、}。一緒に1囲んでF-文字列に、変異体を組み合せる

(2)

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

は、より良い外観と構文を作った、評価するので、明らかに、左から右にあります。しかし、これは、依然として囲む中括弧を残していました。

(3)

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

おそらく、私は全体の手順をoverthinking、自動開梱のいくつかのフォームを期待していました。これは、中括弧が[]に置き換えられたリスト表現を単純に生成しました。
(4)(3)上記の変形で中括弧を抑制するために必要な、または私は私がするために使用しています.format()のオプションを続けるために辞任していますされて何

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

。私はそれをシンプルに保ち、f-stringによって提供される新しい機能を使用し、私が現在快適であるものよりも前のpythonバージョンを元に戻したいと思います。私はf'strings 'が.format()兄弟によって提供されているものの完全な範囲を提供していないと疑い始めています。私はエスケープエンコーディングとf文字列で\を使うことができないことに挑戦していないので、今はそれを残しておきます。私はPEPを読んで広く検索しましたが、明白でないか、あるいは私が望んでいることは現在できません。

EDIT数時間後

私は

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

を必要とするいくつかのケースのために役立つだろう、このバリアントを見つけました。しかし、スライスは、利便性よりも少しあり、まだ周りの文字列の引用符を残し結果

+2

FYI、それが明らかでない場合には:(1)が動作しない理由は、{{ 'その'はf-string内のリテラルブレースをどのように[脱出する](https://www.python.org/dev/peps/pep-0498/#escape-sequences)なので、その例で補間は全く行われません。 –

答えて

6

任意の有効なPythonの式は、F-文字列の括弧内の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' 
+0

@ Zero_Piraeusしかし、提案していただきありがとうございますが、まだドットフォーマットの化身はより不便です。 – NaN

+3

あなたはそれを聞いて申し訳ありません...あなたはf-stringsが予期せぬ変化にマイナスに反応しているだけではないと確信していますか?私にとっては、あなたの 'format'文字列を作るためにジャンプしなければならないフープは、ここで提示されたf-stringの代替語よりも読みにくく、非常に一般的なPythonイディオムを使用しています。 –

+0

私はf-には何の問題もありませんが、私はしばしば不明な長さのリスト、numpyなどの議論を解かなければなりません。これは...( "{}" * len(a))。書式(* a)#a = [1,2,3,4]などがあります。 f形式の同等のものが見つかりませんでした。彼らは両方とも彼らの場所を持っています。ドキュメントの例は非常にシンプルで単純です。それができない場合は、それはクールです。私の使い方では、関数を使うことで少ししか得られません。 2つのミックス・アンド・マッチ・アプローチがうまくいくように見えますが、例(3)は残念ながらそれらの中括弧を残しました...これは私の初期の質問を促しました。 – NaN

0

シンプルな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' 
+0

ありがとう。私は回避策を知っています。この具体例でした...( "{}" * len(a))。format(* a)#a = [1,2,3,4] ... f形式の同等のものが見つからなかったこと。 ...現在のところ、f-書式化は実装されていないので、未知のサイズのオブジェクトをアンパックするときには通常のルートに従うだけで簡単です。また、Python 3の後のバージョンで導入されたアンパックオブジェクト。バツ – NaN

関連する問題