python - 将字典的键和值从 `unicode` 转换为 `str` 的最快方法?

标签 python casting types

我从一个代码“层”接收到一个字典,在将其传递到另一个“层”之前,会在该代码上执行一些计算/修改。原始字典的键和“字符串”值是 unicode,但它们被传递到的层只接受 str

这将被经常调用,所以我想知道转换以下内容的最快方法是什么:

{ u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }

...到:

{ 'spam': 'eggs', 'foo': True, 'bar': { 'baz': 97 } }

...记住非“字符串”值需要保持其原始类型。

有什么想法吗?

最佳答案

DATA = { u'spam': u'eggs', u'foo': frozenset([u'Gah!']), u'bar': { u'baz': 97 },
         u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])]}

def convert(data):
    if isinstance(data, basestring):
        return str(data)
    elif isinstance(data, collections.Mapping):
        return dict(map(convert, data.iteritems()))
    elif isinstance(data, collections.Iterable):
        return type(data)(map(convert, data))
    else:
        return data

print DATA
print convert(DATA)
# Prints:
# {u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])], u'foo': frozenset([u'Gah!']), u'bar': {u'baz': 97}, u'spam': u'eggs'}
# {'bar': {'baz': 97}, 'foo': frozenset(['Gah!']), 'list': ['list', (True, 'Maybe'), set(['and', 'a', 'set', 1])], 'spam': 'eggs'}

假设:

  • 您已导入集合模块并可以使用它提供的抽象基类
  • 您很乐意使用默认编码进行转换(如果您需要显式编码,请使用 data.encode('utf-8') 而不是 str(data)编码)。

如果您需要支持其他容器类型,希望很明显如何遵循该模式并为它们添加案例。

关于python - 将字典的键和值从 `unicode` 转换为 `str` 的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1254454/

相关文章:

python - 生成与现有一维数组具有预先指定相关性的 NumPy 一维数组?

c# - 什么可以用作 C# 字典中的键?

c++11 - 存储指针减法的结果

python - 返回名称包含字符串的所有文件的函数

python - 在递归函数中用尾递归替换 for 循环

java - 不清楚的编译时 Java 错误

java - 将通用集合转换为函数参数

c++ - 错误 C4146 : unary minus operator applied to unsigned type, 结果仍未签名

types - 关于 UTYPE 的了解!在《REBOL 3》中?

python - 2to3 进行多次导入