【问题标题】:Python reduce on len() functionPython 减少 len() 函数
【发布时间】:2017-11-01 21:29:20
【问题描述】:

我有

>>> reduce( (lambda x,y: x + y), [1,2,3])

6

>>> reduce( (lambda x,y: x + y), ['cat','dog','hat'])

'catdoghat'

然后,我想得到列表中所有字符串元素的总和:

>>> reduce( (lambda x,y: len(x) + len(y)), ['cat','dog','hat'])

它会产生错误。

我做错了什么?

【问题讨论】:

  • reduce(lambda x,y: x + y, map(len, ['cat','dog','hat']))

标签: python list lambda


【解决方案1】:

想想你的reduce操作:

(len((len('cat') + len('dog')))+ len('hat'))

您最终会在int 上调用len。你可能想要:

sum(map(len, ['cat','dog','hat']))

并停止重新发明轮子并将reduce 用于sum

另请注意,使用sum(相当于reduce(lambda x,y: x+y, ...) 将具有糟糕的字符串性能,即O(n^2)。相反,使用''.join(sequence_of_strings)

确实,即使你尝试,翻译也会对你大喊大叫!

>>> sum(['a','b','c'], '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

【讨论】:

  • @StefanPochmann 哦!它不让你这样做真是太好了。不幸的是,你仍然可以对 list 对象求和,所以 sum([[1],[2],[3]], [])
  • 嗯,好吧,并不是一直如此。但是当我知道它足够快并且懒得打字时。
  • @StefanPochmann 和一个婴儿...当你这样做时,函数式编程吉祥物会死去reduce(list.__iadd__, [[1],[2],[3]])
  • @StefanPochmann 是的,依靠 reduce 是一个 fold-l 操作这一方便的事实,否则,我认为它会同样低效。
【解决方案2】:

reduce 是一个迭代遍历所有项目并应用操作的过程,让我们尝试用您的示例来做:

reduce( (lambda x,y: len(x) + len(y)), ['cat','dog','hat'])

所以首先 x 是“猫”,y 是“狗”,输出为 6,现在我们将 x 作为 6,y 作为“帽子”,我们将失败len(6)

你想要做的是对字符串的长度求和,你可以使用map,因为与reduce不同,map 对所有项目应用一个函数(这正是你想要的——应用@987654329 @ 到每个项目)和 sum 将负责加法:

sum(map(len, ['cat','dog','hat']))

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 2020-04-03
    • 2023-03-24
    • 2018-04-16
    • 2014-08-04
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多