小编典典

将dict的键和值从unicode转换为str的最快方法?

python

我正在从一个代码“层”收到命令,对该命令进行一些计算/修改,然后再将其传递到另一个“层”。原始dict的键和“字符串”值是unicode,但是将它们传递到的层只接受str

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

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

…至:

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

……请记住,非“字符串”值必须保持其原始类型。

有什么想法吗?


阅读 232

收藏
2021-01-20

共1个答案

小编典典

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'}

假设:

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

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

2021-01-20