当for循环工作正常时,Reduce会给出错误

时间:2016-06-15 10:11:18

标签: python loops functional-programming python-unicode

我有一个列表内容,其中包含lxml.etree._ElementStringResult和lxml.etree._ElementUnicodeResult

for x in contents:
        final_content += (x.encode('utf-8')) + '\n'

final_content = reduce(lambda a, x: a+x.encode('utf-8') + '\n', contents)

第一个代码运行正常,而第二个代码引发了unicode解码错误。

<ipython-input-129-17a363dfff6c> in <lambda>(a, x)
----> 1 final_content = reduce(lambda a, x: a+x.encode('utf-8') + '\n', contents)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
37: ordinal not in range(128)

编辑:

reduce是失败的,因为第一个元素没有被编码。

当我将代码更改为

final_content = contents[0]
for x in range(1,len(contents)):
     final_content += contents[x].encode('utf-8')

它像上面的减少块一样引发了同样的错误。

1 个答案:

答案 0 :(得分:1)

错误是因为您的\n未进行utf-8编码。简单地设置为unicode字符串应该可以解决问题:

final_content = reduce(lambda a, x: a + x.encode('utf-8') + u'\n', contents)

很抱歉&#39;回答店主&#39;关于在未经您许可的情况下编辑您的问题,但问题已经结束,我无法发布正确的答案。可以自由删除此内容:

操作,你假设两个代码都是相同的行为,但不是!因为在第一次映射迭代时,您将连接第一个和第二个元素而不使用\n。而你正在编码第二个元素,但没有编码第一个元素。从经典for循环到reduce方法的正确翻译是:

final_content = reduce(lambda a, x: 
                           a+x.encode('utf-8') + u'\n', 
                       contents, 
                       u'\n')    # <----- initializer

请注意,如果没有初始化程序,您将这样做:

contents[0] + contents[1].encode('utf-8')

这就是引发错误的原因!