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')
这就是引发错误的原因!
我有一个列表内容,其中包含 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')
这就是引发错误的原因!