【问题标题】:How to convert unicoded dict into a string如何将unicode dict转换为字符串
【发布时间】:2012-06-21 13:54:18
【问题描述】:

我的问题如下。我们有所有键和值都为 unicode 的 dict,例如:

ab = {
    u'a': u'A',
    u'b': u'B',
    u'c': u'C',
}

我想把它转换成一个字符串。显然,当我这样做时:

str(ab)

我会收到:

"{u'a': u'A', u'c': u'C', u'b': u'B'}"

如果我这样做:

unicode(ab)

我会收到:

u"{u'a': u'A', u'c': u'C', u'b': u'B'}"

我的预期结果是:

"{'a': 'A', 'c': 'C', 'b': 'B'}"

目前我发现,如果我执行 json.dumps,它会正确地将其转换为字符串,在每个键和值之前没有额外的 'u',但它也会将 True 更改为 true 和其他 javascript 方言差异。

除了对我的数据结构进行递归迭代之外,还有什么解决方法吗?

【问题讨论】:

  • 你想用这个字符串表示来达到什么目的?
  • 我同意这里的目标对于实现这一点的最佳方式(或不这样做)可能很重要。
  • 遗留代码,它只是假设我们在数据库中有可以在检索时解码的字符串化数据结构
  • @Drachenfels 如果你能改变它,那么为了你自己,请这样做。从数据库的角度来看,从代码的角度来看,这是一个糟糕的想法。
  • 我很清楚,最近我们升级了django版本,所有字段都是unicode,所以我们的字典是unicode的,我们的代码是将dicts转换为string,unicodes意味着我们完全数据库中损坏的数据。最后,我对此无能为力,这是一个巨大的失败。

标签: python type-conversion


【解决方案1】:

不,您需要手动将每个项目转换为字符串,然后将 dict 字符串化,并注意除非 Unicode 数据恰好都是 ASCII,否则您可能会遇到问题。做出这样的假设,您可以使用 dict 理解使其更快更简洁:

print({str(key): str(value) for key, value in ab.items()})
{'a': 'A', 'c': 'C', 'b': 'B'}

如果您使用的是 2.7.3 之前的 Python 版本,没有字典推导:

dict((str(key), str(value)) for key, value in ab.items())

【讨论】:

  • OP 解释了为什么他们不想使用 JSON。
  • @SvenMarnach 有点像,但是(s)他没有解释他们将使用数据的目的以及为什么将其保留为 Python 文字很重要。在大多数情况下,从 JSON 编码/解码是一个更好的主意。
  • 由于问题在 cmets 中进一步解释,我删除了关于 JSON 的注释 - 在这种情况下使用它几乎一样糟糕。
  • str(x) 相比,使用x.encode('utf-8') 来保留任何非ASCII Unicode 字符可能会更好。
  • @MarkRansom 这是真的,尽管这可能不是提问者想要的。我坚持提问者在问题中显示的内容。
【解决方案2】:

如果您使用的是 python 2.x:

dict( map(str, item) for item in ab.iteritems() )

【讨论】:

  • 为什么这是 2.x 独有的?对于 3.x,将调用从 iteritems() 更改为 items() 很容易。
  • @Lattyware:在 3.x 中使用字典理解会更好
  • 字典推导式存在于 2.7.3 中。
猜你喜欢
  • 2015-10-27
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2015-11-08
相关资源
最近更新 更多