2017-07-06 20 views
1

文字列値のk-vペアからなる辞書があります。それぞれを==> &で区切り、改行に印刷します。文字列の辞書をPythonのテキストブロックに変換する方法

私は変換を仲介するために配列を使用していますが、これは不要なようです& inelegant。 可能であれば、これを1行で行いたいと思います。

は、ここで私が持っているものです。

foo_dict = { 
    'a' : '1', 
    'b' : '2', 
    'c' : '3', 
    } 
foo_list = [] 
for k, v in foo_dict.items(): 
    foo_list.append('{} ==> {}'.format(k, v)) 
foo_text = '\n'.join(foo_list) 

これが印刷されます:

b ==> 2 
c ==> 3 
a ==> 1 

を順番は(そうでない場合、私はちょうどOrderedDictを使用すると思います。)問題ではありません。大事なことは、すべてのKVということですペアが正しい形式で印刷されます。

+1

'' '可能であれば1行' ' - なぜですか? – wwii

+0

@wwiiの方が読みやすくなっています! –

答えて

5

次のワンライナーを行います:

foo_text = '\n'.join('{} ==> {}'.format(*t) for t in foo_dict.items()) 

それとも使用することができstarmap(..)

from itertools import starmap 

foo_text = '\n'.join(starmap('{} ==> {}'.format,foo_dict.items())) 

どちらの生成:

>>> '\n'.join('{} ==> {}'.format(*t) for t in foo_dict.items()) 
'b ==> 2\na ==> 1\nc ==> 3' 
>>> '\n'.join(starmap('{} ==> {}'.format,foo_dict.items())) 
'b ==> 2\na ==> 1\nc ==> 3' 

str.joinは、単にのいずれかのタイプを受け入れますiterable私たちは発電機を使用することができる、またはリスト。

foo_text = '\n'.join(['{} ==> {}'.format(*t) for t in foo_dict.items()]) 

を、それは可能性があるため、単純にワンライナーを書くこの言われているノートは正当な理由ではありません。我々はまた、リストの内包表記を使用して、元ビットを向上させることができます。時間の複雑さを変更したり、効率に重大な影響を及ぼすことなく、常に可読性に目を向けるべきです。この場合、これはおそらく問題ではありません。しかし、暗号的な1ライナーは、むしろ、非Pythonicです。

2

あなたはそれをワンライナーになりたい場合は、リストの内包を書き、\nで文字列要素を結合する:

print('\n'.join(["{} ==> {}".format(k, foo_dict[k]) for k in foo_dict])) 
1

あなたがこの試すことができます:他の回答ものの

new_list = [a+"==>"+b if isinstance(a, str) and isinstance(b, str) else str(a)+"==>"+str(b) for a, b in foo_dict.items()] 

#then, just print the contents 

for i in new_list: 
    print i 
+0

このアプローチの潜在的な問題は、文字列でないキーまたは値があるとエラーになることです。ここには該当しませんが、あなたの答えに「警告」を加えるべきでしょう。 –

+0

@WillemVanOnsemまたは連結する前に単に 'a'と' b'を文字列にキャストします。 –

+0

私は本当に三項演算子が使われる理由は分かりません。 'x'が文字列なら' str(x)== x'です。 –

2

をこの機能が必要な場合は、collections.UserDictから継承してカスタム辞書オブジェクトを作成し、デフォルトの__repr__()を上書きすることを検討することをお勧めします。

>>> from collections import UserDict 
>>> 
>>> class custom_dict(UserDict): 
...  def __repr__(self): 
...   return '\n'.join('{} ==> {}'.format(k, v) for k, v in self.data.items()) 
... 
>>> foo_dict = { 
...  'a' : '1', 
...  'b' : '2', 
...  'c' : '3', 
...  } 
>>> 
>>> new_dict = custom_dict(foo_dict) 
>>> new_dict 
a ==> 1 
b ==> 2 
c ==> 3 
>>> 
関連する問題