Reduce 给出错误,而 for 循环工作正常

Reduce is giving error while for loop is working fine

我有一个列表内容,其中包含 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')

它引发了与上面的 reduce 块相同的错误。

错误是因为您的 \n 不是 utf-8 编码的。只需设置为 unicode 字符串即可解决问题:

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

抱歉 'answer owner' 未经您的许可在此处编辑您的问题,但问题已关闭,我无法 post 正确答案。请随意删除此内容:

Op,您假设这两个代码的行为相同,但事实并非如此!因为在第一次地图迭代中,您连接了第一个和第二个元素,没有 \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')

这就是引发错误的原因!