Python:字典转字符串,自定义格式?

46

目前我只显示键,每个键在新行中:

'<br/>'.join(mydict)

如何将它们显示为key:: value,每个在新行中?

5个回答

112

遍历 dict.items() 迭代器,它会产生一个键-值元组:

'<br/>'.join(['%s:: %s' % (key, value) for (key, value) in d.items()])

使用现代的f-string符号进行更新:

'<br/>'.join([f'{key}:: {value}' for key, value in d.items()])

3
这是我见过的最符合Python风格的解决方案。太棒了。 - laughing_man
3
如果不展开元组,可以更简洁地编写代码: '<br/>'.join(['{}:{}'.format(k, v) for k, v in d.items()]) - Greg Bray

11
那么,或者更酷的解决方案是使用join将两个元素和(键,值)对连接起来,避免现在已过时的%插值,只使用一个虚拟变量_,并删除冗余的列表推导式:
"<br/>".join(":: ".join(_) for _ in mydict.items())

请注意字典是无序的,因此如果没有使用sorted(),您可能得不到想要的结果:

>>> mydict = dict(a="A", b="B", c="C")
>>> ", ".join("=".join(_) for _ in mydict.items())
'a=A, c=C, b=B'

当所有的键和值都是字符串时,这种方法才有效,否则 join 会报错。更健壮的解决方案是:

", ".join("=".join((str(k),str(v))) for k,v in mydict.items())

现在它工作得非常好,即使是混合类型的键和值:

>>> mydict = {'1':1, 2:'2', 3:3}
>>> ", ".join("=".join((str(k),str(v))) for k,v in mydict.items())
'2=2, 3=3, 1=1'

当涉及到混合类型时,简单的sorted()将无法按预期工作。只有在您知道所有键都是字符串(或者都是数字等)时才使用它。在前一种情况下,您也可以省略第一个str()
>>> mydict = dict(a=1, b=2, c=2)
>>> ", ".join("=".join((k,str(v))) for k,v in sorted(mydict.items()))
'a=1, b=2, c=3'

最后一个是我的字典相同的数据格式。但是当我尝试使用你的解决方案时,它返回了这个错误信息:TypeError:'str'对象不可调用。 - Jihye Seo
@JihyeSeo:你正在尝试我的哪个解决方案,你的字典布局是什么?我提供了三种选择:最简单的一种需要键和值都是字符串;更健壮的一种适用于混合数据但无法进行sorted()排序,最后一种期望统一的数据(和字符串键)。这完全取决于您的数据格式。 - MestreLion
@JihyeSeo:根据你的错误,很可能你将一个变量命名为“str”,遮蔽了内置的“str”类。不要使用内置名称来命名你的对象! - MestreLion
我用的是上一个方案。我没有使用内置的 str 类。无论如何,我使用了另一种不同的解决方案。非常感谢! - Jihye Seo

7
在Python 3.6中,我更喜欢这种语法,它使代码更易读。
'<br/>'.join([f'{key}: {value}' for key, value in d.items()])

查看PEP 498 -- 字符串插值,请参见此链接

3
如果您希望更符合 Python 风格,我们可以完全移除 for 推导式。
'<br/>'.join(map(':: '.join, mydict.items()))

1
'<br/>'.join(map(':: '.join, mydict.items()))代码末尾缺少一个 - L F

1

我喜欢Filip Dupanović上面所做的事情。我使用str.format方法将其修改为适用于Python3的代码。

'<br/>'.join(['{0}:: {1}'.format(key, value) for (key, value) in d.items()])

我修改了上述内容,生成一个字符串,可以用于SQL表创建语句。
fieldpairs = ','.join(['{0} {1}'.format(key, value) for (key, value) in HiveTypes.items()])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接