为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喔喔 2019-10-25 15:00:07
我正在从一个代码“层”收到命令,对该命令进行一些计算/修改,然后再将其传递到另一个“层”。原始dict的键和“字符串”值是unicode,但是将它们传递到的层只接受str。这将经常被调用,所以我想知道什么是最快的转换方式:{ u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }...至:{ 'spam': 'eggs', 'foo': True, 'bar': { 'baz': 97 } }...请记住,非“字符串”值必须保持其原始类型。有什么想法吗?
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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))。

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


查看完整回答
反对 回复 2019-10-25
?
繁星coding

TA贡献1797条经验 获得超4个赞

我知道我迟到了:


def convert_keys_to_string(dictionary):

    """Recursively converts dictionary keys to strings."""

    if not isinstance(dictionary, dict):

        return dictionary

    return dict((str(k), convert_keys_to_string(v)) 

        for k, v in dictionary.items())


查看完整回答
反对 回复 2019-10-25
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

如果您想内联执行此操作,并且不需要递归下降,则可以使用以下方法:


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

print DATA

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


STRING_DATA = dict([(str(k), v) for k, v in data.items()])

print STRING_DATA

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


查看完整回答
反对 回复 2019-10-25
  • 3 回答
  • 0 关注
  • 920 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信