Python:将复杂字符串字典从Unicode转换为ASCII
可能重复:Python:将复杂字符串字典从Unicode转换为ASCII,python,json,algorithm,unicode,ascii,Python,Json,Algorithm,Unicode,Ascii,可能重复: 我有很多输入,作为从JSON API调用解析的多级字典。这些字符串都是unicode格式的,这意味着有很多像这样的u'东西。我正在使用这些结果,需要将这些结果转换为ASCII 我知道我可以编写一个函数,这样转换它: def convert(input): if isinstance(input, dict): ret = {} for stuff in input: ret = convert(stuff) e
我有很多输入,作为从JSON API调用解析的多级字典。这些字符串都是unicode格式的,这意味着有很多像这样的
u'东西
。我正在使用这些结果,需要将这些结果转换为ASCII
我知道我可以编写一个函数,这样转换它:
def convert(input):
if isinstance(input, dict):
ret = {}
for stuff in input:
ret = convert(stuff)
elif isinstance(input, list):
ret = []
for i in range(len(input))
ret = convert(input[i])
elif isinstance(input, str):
ret = input.encode('ascii')
elif :
ret = input
return ret
这是正确的吗?不确定。这不是我想问你的
我想问的是,这是一个典型的强力解决方案。一定有更好的办法。一种更像蟒蛇的方式。我不是算法专家,但这个看起来也不是特别快
那么有更好的方法吗?或者如果没有,这个功能可以改进吗
回答后编辑 是正确的,但我想发布它的修改版本。他的函数在Python 2.7+上工作,而我在2.6上,因此必须将其转换为:
def convert(input):
if isinstance(input, dict):
return dict((convert(key), convert(value)) for key, value in input.iteritems())
elif isinstance(input, list):
return [convert(element) for element in input]
elif isinstance(input, unicode):
return input.encode('utf-8')
else:
return input
递归似乎是一种方法,但是如果您使用的是Python2.xx,那么您希望检查的是
unicode
,而不是str
(strstr
类型表示一个字节字符串,unicode
类型表示一个unicode字符字符串;两者都不从另一个继承,而是unicode类型的字符串显示在解释器中,前面有一个u)
您发布的代码中也有一点语法错误(后面的elif:
应该是else
),如果输入是字典或列表,则不会返回相同的结构。(对于字典,返回最终键的转换版本;对于列表,返回最终元素的转换版本。两者都不对!)
通过使用理解,您还可以使您的代码变得美观、通俗
下面是我的建议:
def convert(input):
if isinstance(input, dict):
return {convert(key): convert(value) for key, value in input.iteritems()}
elif isinstance(input, list):
return [convert(element) for element in input]
elif isinstance(input, unicode):
return input.encode('utf-8')
else:
return input
最后一件事。我将
encode('ascii')
更改为encode('utf-8')
。我的推理如下:任何仅包含ASCII字符集中字符的unicode字符串在ASCII编码时与在utf-8编码时将由相同的字节字符串表示,因此使用utf-8而不是ASCII不能破坏任何内容,并且只要您处理的unicode字符串在但是,此更改扩展了函数的范围,以便能够处理整个unicode字符集中的字符字符串,而不仅仅是ASCII字符,如果需要这样做的话。如果您使用的是Python 2,则unicode不是str
,而是unicode
的实例。此外,在ret
将只包含字典中最后一个键转换为的内容。@MichaelMior按照您描述的方式处理任何iterable的问题是,并非所有iterable都是列表式的。例如,字典都是iterable,但ret=[convert(x)For x input]如果input
是一个字典,那么显然不是我们想要的。@MarkAmery当然了。字典需要单独处理。+1.除了你对递归的评论:)递归对于几乎任何类型的树遍历和大多数解析问题都很有用。递归通常是“必经之路”,尤其是在函数式编程方面。@JoelCornett说得很对。我的评论并不是泛泛的反递归;我可以看出递归在树遍历问题中是有意义的,我想很多解析问题都是其中的一个子集。我只是对这个游戏非常陌生,不是来自compsci的背景,所以我没有遇到过类似的问题我自己也遇到过这种性质的问题。我看到的递归示例往往是毫无意义和人为的,并将其应用于迭代更清晰的情况。这是我第一次突然说“哇,递归真的简化了这里的事情”,这让我很兴奋。:)谢谢,这真的很好。比这个问题中的任何答案都要好得多,因为这应该是的一个副本。另外,我发布了一个修改版本的代码,用于老python,工作得很有魅力,谢谢