我正在尝试使用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')
答案 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 reduce
。 reduce
已从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