尝试将reduce()和lambda与包含字符串的列表一起使用

时间:2012-03-15 00:44:43

标签: python lambda

我正在尝试在包含整数字符串的列表中使用pythons reduce函数。

print int("4")
\\Gives me 4 Good
print reduce(lambda x,  y: x*y,  [2, 3, 4])
\\Gives me 24 Good
print reduce(lambda x,  y: x*int(y),  ['2',  '3',  '4'])
\\Gives me 222222222222 What??

我假设reduce给lambda函数一些不是列表中实际字符串的东西?我不知道为什么我至少得到222222222222,是否有一个简单的方法使列表成为一个int?我想我可以给我们另一个循环,但我仍然想知道传递字符串有什么不对。

4 个答案:

答案 0 :(得分:7)

>>> reduce(lambda x,  y: x*int(y),  ['2',  '3',  '4'])
'222222222222'

好的,这是发生的事情:

在第一个缩小步骤中,完成以下计算:'2' * 3。由于第一个操作数是一个字符串,它只会重复3次。所以你最终得到了'222'

在第二个缩小步骤中,该值乘以4:'222' * 4。同样,该字符串重复四次,结果为'222222222222',这正是您得到的结果。

你可以通过将x转换为int(调用int(x)),或者首先使用整数转换映射列表元素来避免这种情况(我实际上认为它更优雅):

>>> reduce(lambda x, y: x * y, map(int, ['2', '3', '4']))
24

答案 1 :(得分:4)

你可以试试这个:

reduce(lambda x,  y: x*int(y),  ['2',  '3',  '4'], 1)

请注意,我将第三个参数传递给reduce,表示操作应该在1中初始化,即乘法身份。这样,您只需要将y当前值转换为int,而不是x累积

答案 2 :(得分:1)

你将字符串'2'乘以int 3,它将字符串'222'...然后字符串'222'乘以int 4,它给出字符串'222222222222'。

您需要将x转换为整数:

print reduce(lambda x,  y: int(x)*int(y),  ['2',  '3',  '4'])

答案 3 :(得分:0)

multiply = lambda a,b: a*b
listOfInts = map(int, ['2','3','4'])

reduce(multiply, listOfInts)  #output: 24