将字典的键和值从“unicode”转换为“str”的最快方法?
- 2025-03-20 08:48:00
- admin 原创
- 23
问题描述:
我从代码的一个“层”接收一个字典,在将其传递到另一个“层”之前,会对其进行一些计算/修改。原始字典的键和“字符串”值是unicode
,但它们传递到的层只接受str
。
这将经常被调用,所以我想知道什么是转换以下内容的最快方法:
{ u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }
...到:
{ 'spam': 'eggs', 'foo': True, 'bar': { 'baz': 97 } }
...请记住非“字符串”值需要保持其原始类型。
有什么想法吗?
解决方案 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)
使用明确的编码)。
如果您需要支持其他容器类型,希望您能清楚地知道如何遵循模式并为它们添加案例。
解决方案 2:
我知道我这次迟到了:
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:
如果你想以内联方式执行此操作并且不需要递归下降,那么这可能会起作用:
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:
对于非嵌套字典(由于标题没有提到这种情况,其他人可能会感兴趣)
{str(k): str(v) for k, v in my_dict.items()}
解决方案 5:
def to_str(key, value):
if isinstance(key, unicode):
key = str(key)
if isinstance(value, unicode):
value = str(value)
return key, value
将键和值传递给它,并将递归添加到代码中以解释内部字典。
解决方案 6:
为了使其全部内联(非递归):
{str(k):(str(v) if isinstance(v, unicode) else v) for k,v in my_dict.items()}
解决方案 7:
>>> 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'}
解决方案 8:
只需使用print(*(dict.keys()))
可用于解包容器,例如列表。有关 * 的更多信息,请查看此 SO 答案。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD