代码之家  ›  专栏  ›  技术社区  ›  Phillip B Oldham

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

  •  74
  • Phillip B Oldham  · 技术社区  · 15 年前

    我正在接收一个“层”代码的dict,在将它传递到另一个“层”之前,在它上面执行一些计算/修改。原始dict的keys&“string”值为 unicode ,但传递给它们的层只接受 str .

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

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

    …to:

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

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

    有什么想法吗?

    6 回复  |  直到 7 年前
        1
  •  145
  •   RichieHindle    11 年前
    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) 如果需要显式编码)。

    如果您需要支持其他容器类型,那么很可能很明显如何遵循这个模式并为它们添加案例。

        2
  •  22
  •   Germano    13 年前

    我知道这次我迟到了:

    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())
    
        3
  •  12
  •   Samuel Clay    13 年前

    如果您想以内联方式执行此操作,并且不需要递归下降,那么这可能有效:

    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 } }"
    
        4
  •  3
  •   SilentGhost    15 年前
    def to_str(key, value):
        if isinstance(key, unicode):
            key = str(key)
        if isinstance(value, unicode):
            value = str(value)
        return key, value
    

    将键和值传递给它,并将递归添加到代码中以说明内部字典。

        5
  •  2
  •   maxbellec    8 年前

    对于非嵌套的dict(因为标题没有提到这种情况,所以其他人可能会感兴趣)

    {str(k): str(v) for k, v in my_dict.items()}
    
        6
  •  2
  •   Ben    7 年前

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

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