我的字典中充满了字符串值的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对都以正确的格式打印。
答案 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