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

时间:2017-07-06 16:43:15

标签: python string dictionary

我的字典中充满了字符串值的k-v对,我希望每个字符都由==>&然后打印到换行符。

我使用数组来调解转换,这似乎是不必要的&不雅。 如果可能,我想在一行中执行此操作。

这就是我所拥有的:

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。)重要的是所有k-v对都以正确的格式打印。

4 个答案:

答案 0 :(得分: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()])

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

答案 1 :(得分:2)

如果你想让它成为一个单行,你可以写一个列表理解并用\n加入字符串元素:

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

答案 2 :(得分: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
>>>

答案 3 :(得分: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