我正在尝试在包含整数字符串的列表中使用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?我想我可以给我们另一个循环,但我仍然想知道传递字符串有什么不对。
答案 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