【问题标题】:python reduce error?python减少错误?
【发布时间】:2010-12-17 08:21:43
【问题描述】:

以下是我的python代码:

>>> item = 1
>>> a = []
>>> a.append((1,2,3))
>>> a.append((7,2,4))
>>> sums=reduce(lambda x:abs(item-x[1]),a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes exactly 1 argument (2 given)
>>> 

我该如何解决? 谢谢!

【问题讨论】:

  • 请注意sum是python中的内置函数,因此建议您使用不同的名称,就像我在回答中所做的那样。
  • 我把总和改成总和,还是出现了同样的错误。
  • 是的,当然。下面的答案解释了真正的问题是什么。我只是说现在隐藏sum 函数是一个更好的做法:)
  • 此外,我认为您可以从答案中看到,尚不清楚您要做什么。您能否添加对该代码应该完成的功能的描述?

标签: python lambda arguments reduce


【解决方案1】:

您的 lambda 只接受一个参数,但 reduce 需要一个接受两个参数的函数。让你的 lambda 接受两个参数。

由于你没有说你想让这段代码做什么,我只是猜测:

the_sum=reduce(lambda x,y:abs(y[1]-x[1]),a)

【讨论】:

    【解决方案2】:

    您的问题本身有点不清楚。无论如何,我只是假设--

    >>> a = []
    >>> a.append((1,2,3))
    >>> a.append((7,2,4))
    >>> a
    [(1, 2, 3), (7, 2, 4)] # list of tuples
    

    我假设您可能对获取列表中所有元素的总和感兴趣。如果这是问题,那么可以分两步解决

    1) 第一步应该是展平列表。

    2) 然后添加列表的所有元素。

    >>> new_list = [y for x in a for y in x] # List comprehension used to flatten the list
    [1, 2, 3, 7, 2, 4] 
    >>> sum(new_list)
    19
    

    一个班轮

    >>> sum([y for x in a for y in x])
    19
    

    另一个假设,如果你的问题是在列表中逐项减去元组的每个元素,那么使用这个:

    >>> [tuple(map(lambda y: abs(item - y), x)) for x in a]
    [(0, 1, 2), (6, 1, 3)] # map function always returns a list so i have used tuple function to convert it into tuple.
    

    如果是其他问题,请详细说明。

    PS:Python 列表理解比其他任何东西都要好和高效。

    【讨论】:

      【解决方案3】:

      reduce 期望给它的函数接受 2 个参数。对于可迭代对象中的每个项目,它将向函数传递当前项目,以及函数的前一个返回值。所以,得到一个列表的总和是reduce(lambda: x,y: x+y, l, 0)

      如果我理解正确,要获得您想要获得的行为,请将代码更改为:

      a_sum = reduce(lambda x,y: x + abs(item-y[1]), a, 0)
      

      但我可能弄错了你想要得到的东西。 更多信息在reduce 函数的文档字符串中。

      【讨论】:

        猜你喜欢
        • 2017-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 2017-10-15
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多