我从一个代码“层”接收到一个字典,在将其传递到另一个“层”之前,会在该代码上执行一些计算/修改。原始字典的键和“字符串”值是 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/