转换字典键和键的最快方法从`unicode`到`str`的​​值?

时间:2009-08-10 11:51:18

标签: python casting types

我从一个代码“层”接收到一个字典,在将代码传递到另一个“图层”之前执行一些计算/修改。最初的字典键和& “字符串”值为unicode,但传递给它的图层只接受str

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

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

...为:

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

...请记住非“字符串”值需要保留为原始类型。

有什么想法吗?

8 个答案:

答案 0 :(得分:145)

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

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

答案 1 :(得分:23)

我知道我迟到了这个:

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

答案 2 :(得分:12)

如果你想内联并且不需要递归下降,这可能有效:

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

答案 3 :(得分:3)

def to_str(key, value):
    if isinstance(key, unicode):
        key = str(key)
    if isinstance(value, unicode):
        value = str(value)
    return key, value

将密钥和值传递给它,并向代码添加递归以考虑内部字典。

答案 4 :(得分:3)

对于非嵌套字典(因为标题没有提到这种情况,对其他人来说可能很有趣)

{str(k): str(v) for k, v in my_dict.items()}

答案 5 :(得分:2)

使其全部内联(非递归):

{str(k):(str(v) if isinstance(v, unicode) else v) for k,v in my_dict.items()}

答案 6 :(得分:0)

只需使用* def nums = $response..rRar * def temp = $response..lRar * karate.appendTo(nums, temp) * def strs = karate.map(nums, function(x){ return x + '' }) * match each strs == '#regex [0-9].+\\.[0-9]{2}'

*可用于解开容器的包装,例如列表。有关*的更多信息,请检查this SO answer

答案 7 :(得分:0)

>>> d = {u"a": u"b", u"c": u"d"}
>>> d
{u'a': u'b', u'c': u'd'}
>>> import json
>>> import yaml
>>> d = {u"a": u"b", u"c": u"d"}
>>> yaml.safe_load(json.dumps(d))
{'a': 'b', 'c': 'd'}