使用lambda

时间:2017-10-14 06:09:36

标签: python lambda

我正在尝试使用lambda函数来添加所有数字。我收到了以下错误,

  

语法错误 - "如果不是唯一的,则生成器表达式必须加括号   参数"

def solve(s):
    return reduce(lambda x, y: x + int(y) for y in s if y.isdigit(),s)

print solve('1o2i212')

如果我使用以下内容,它会起作用。

def solve(s):
    return reduce(lambda x, y: x + y, [int(i) for i in s if i.isdigit()])

print solve('1o2i212')

5 个答案:

答案 0 :(得分:1)

使用List Comprehensions的简单解决方案。

def solve(s):
    return sum([int(c) for c in s if c.isdigit()])
print(solve('1o2i212'))

使用functools.reduce(Python 3)的解决方案:

import functools
def solve(s):
    return functools.reduce(lambda x, y: x + int(y),[y for y in s if y.isdigit()],0)
print(solve('1o2i212'))

N.B。:0是初始值设定项,它是functools.reduce的可选参数。

  

如果存在可选的初始化程序,则将其放在项目之前   计算中的序列,并作为默认值   序列是空的。

输出:

8

答案 1 :(得分:1)

Python 3用户应该from functools import reducereduce已从Python 3中移出内置函数。

return reduce(lambda x, y: x + int(y),(y for y in s if y.isdigit()),0)

<强>输出

8

<强>解释

lambda x, y: x + int(y),        #x is the aggregating sum
(y for y in s if y.isdigit()),  #reduced over all the digits in s
0                               #x=0 the starting sum value.

要理解reduce,请检查here它需要一个0的起始种子以避免转换错误

如果您没有给出起始值: -

>>> def solve(s):
...     return reduce(lambda x, y: x + int(y),(y for y in s if y.isdigit()))
... 
>>> print(solve('1o2i212'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in solve
  File "<stdin>", line 2, in <lambda>
TypeError: must be str, not int

如果您不想为聚合提供起始值,请执行以下操作: -

return reduce(lambda x, y: x + y,(int(y) for y in s if y.isdigit()))

答案 2 :(得分:1)

注意:Python 3开发人员需要使用:

from functools import reduce

签名为reduce(function, iterable[, initializer])

所以,你可以分解如下:

def solve(s):
    function = lambda x, y: x + int(y)
    iterable = (c for c in s if c.isdigit())
    initializer = 0
    return reduce(function, iterable, initializer)

print(solve('1o2i212'))

你得到8。

这里, iterable 是一个生成器对象。 请注意,初始值设定项是必需的,因为默认值为None

你可以用括号将所有东西放在一起。

def solve(s):
    return reduce(lambda x, y: x + int(y), (c for c in s if c.isdigit()), 0)

答案 3 :(得分:1)

在使用lambda之前你必须先了解一些事情:

lambda语法的工作原理;

lambda x,y:x+y   #this is lambda function 

现在我们将参数传递给这个lambda,有两种方法可以将参数传递给第一个:

arg=lambda x,y:x+y
print(arg(1,2))

第二种方法:

print((lambda x,y:x+y)(1,2))

现在,如果我们使用reduce with lambda,那么语法是:

print(reduce(lambda x,y:x+y,[1,2,3,4,5]))

因此,如果您传递的是生成器表达式,那么lambda语法应该是什么:

print(reduce(lambda x,y:x+y,(generator expression)))

你的生成器表达式是:

(y for y in s if y.isdigit())

让我们使用lambda语法:

print(reduce(lambda x,y:x+y,(y for y in s if y.isdigit())))

好了,现在我们不需要打印,因为我们正在使用函数并返回结果:

def solve(s):
    return reduce(lambda x,y:x+y,(y for y in s if y.isdigit()))

print(solve('1o2i212'))

当你运行这个程序时,你会得到:

12212

因为我们正在添加字符串,当你执行str(1)+ str(2)时,python中的12不是3所以我们需要更正将str转换为int:

def solve(s):
    return reduce(lambda x, y: x+y, (int(y) for y in s if y.isdigit()))

print solve('1o2i212')

现在输出是:

8

你在做什么错误:

您的生成器表达式错误,因为您正在使用lambda参数与生成器表达式输出混合:

(int(y) for y in s if y.isdigit())  #this is correct

所以改变这个:

reduce(lambda x, y: x + int(y) for y in s if y.isdigit(),s)

到此:

reduce(lambda x, y: x+y, (int(y) for y in s if y.isdigit()))

答案 4 :(得分:0)

我认为这样的事实上应该足以解决这个问题。

solve = lambda x: sum([int(i) for i in x if i.isdigit()])
solve('1o2i212') #8