【问题标题】:Reduce is giving error while for loop is working fine [duplicate]当 for 循环工作正常时,Reduce 给出错误 [重复]
【发布时间】:2016-10-16 09:22:15
【问题描述】:

我有一个包含 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 块相同的错误。

【问题讨论】:

  • 离题:final_content = u'\n'.join( [x.encode('utf-8') for x in contents] )
  • @bhargav 这个问题是关于reduce而不是编码的问题。
  • @danihp 该评论是为那些将问题关闭为重复的模组的。
  • 好吧,我在@hjpotter92 答案中发布了我的答案。我希望他不要难过。
  • @danihp 是的,谢谢我想通了,并用reduce(lambda a, x: a+x.encode('utf-8') + '\n', contents, contents[0].encode('utf-8')) 替换了代码应该在想通后编辑问题。

标签: python loops functional-programming python-unicode


【解决方案1】:

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

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

抱歉,“答案所有者”未经您的许可在此处编辑您的问题,但问题已关闭,我无法发布正确答案。随意删除此内容:

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

这就是引发错误的原因!

【讨论】:

  • 仍然出现同样的错误。
  • 在^^评论后更新。
猜你喜欢
  • 1970-01-01
  • 2019-11-16
  • 2017-11-11
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多