如何使用python将字符串字典转换为文本块

Rob*_*xal 1 python string dictionary

我有一个字典中充满了字符串值的kv对,我希望每个==>字符都用&分隔,然后打印到换行符.

我使用数组来调解转换,这似乎是不必要的和不优雅的.如果可能的话,我想在一行中做到这一点.

这就是我所拥有的:

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)
Run Code Online (Sandbox Code Playgroud)

这将打印:

b ==> 2
c ==> 3
a ==> 1
Run Code Online (Sandbox Code Playgroud)

顺序无关紧要(否则我只是使用OrderedDict.)重要的是所有kv对都以正确的格式打印.

Wil*_*sem 5

以下单行将做:

foo_text = '\n'.join('{} ==> {}'.format(*t) for t in foo_dict.items())
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用starmap(..):

from itertools import starmap

foo_text = '\n'.join(starmap('{} ==> {}'.format,foo_dict.items()))
Run Code Online (Sandbox Code Playgroud)

两者都产生:

>>> '\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'
Run Code Online (Sandbox Code Playgroud)

str.join只接受任何类型的iterable,所以我们可以使用生成器或列表.我们还可以通过使用列表理解来提升前者:

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

这就是说,简单地写一个单行因为它是可能的并不是一个好理由.您应该始终考虑可读性(因为它不会改变时间复杂性或对效率产生重大影响).在这种情况下,这可能不是问题.但是隐密的单行是非Pythonic.