Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:将复杂字符串字典从Unicode转换为ASCII_Python_Json_Algorithm_Unicode_Ascii - Fatal编程技术网

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
(str
str
类型表示一个字节字符串,
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
的实例。此外,在中DE> > <代码> >代码> DICT< /Cuff>处理,您做的不对。对于列表的情况,您可能希望考虑处理任何可迭代的。无论如何,可以用if > ReT= = [If(x)为输入中的x(x)]替换if语句的那个分支。。另外,请检查字典的大小写。
ret
将只包含字典中最后一个键转换为的内容。@MichaelMior按照您描述的方式处理任何iterable的问题是,并非所有iterable都是列表式的。例如,字典都是iterable,但
ret=[convert(x)For x input]如果
input
是一个字典,那么
显然不是我们想要的。@MarkAmery当然了。字典需要单独处理。+1.除了你对递归的评论:)递归对于几乎任何类型的树遍历和大多数解析问题都很有用。递归通常是“必经之路”,尤其是在函数式编程方面。@JoelCornett说得很对。我的评论并不是泛泛的反递归;我可以看出递归在树遍历问题中是有意义的,我想很多解析问题都是其中的一个子集。我只是对这个游戏非常陌生,不是来自compsci的背景,所以我没有遇到过类似的问题我自己也遇到过这种性质的问题。我看到的递归示例往往是毫无意义和人为的,并将其应用于迭代更清晰的情况。这是我第一次突然说“哇,递归真的简化了这里的事情”,这让我很兴奋。:)谢谢,这真的很好。比这个问题中的任何答案都要好得多,因为这应该是的一个副本。另外,我发布了一个修改版本的代码,用于老python,工作得很有魅力,谢谢