作者:欧毅儒 | 来源:互联网 | 2023-09-10 13:49
>>> import functools as ft
>>> bk = ft.reduce(lambda x, y: x[0] + "." + y[0], ['alfa', 'bravo', 'charlie', 'delta'])
>>> bk
'a.d'
>>> km = ft.reduce(lambda x, y: x + y, [1, 2, 3, 4])
>>> km
10
>>> bk = ft.reduce(lambda x, y: x[0] + y[0], ['alfa', 'bravo', 'charlie', 'delta'])
>>> bk
'ad'
>>>
我期待像’a.b.c.d’或’abcd’这样的东西.不知怎的,无法解释结果.这里有类似的问题,但不完全像这个.
解决方法:
执行作为第一个参数传递的函数的结果将是下一次迭代中该函数的第一个参数.所以,你的代码就是这样的
lambda x, y: x[0] + "." + y[0]
>当x,y分别是’alfa’和’bravo’时,a.b.
>现在,x将是a.b而y将是’charlie’,因此结果将是a.c
>现在,x将是a.c而y将是’delta’,因此结果将是a.d
这就是为什么结果是a.d
为了得到你想要的东西,把所有字符串中的所有第一个字符组成一个列表,并将所有元素与.一起加入.,像这样
print(".".join([item[0] for item in data]))
# a.b.c.d
注意:我不会喜欢这种方式,但为了完整起见,你可以使用reduce来实现,就像这样
data = ['alfa', 'bravo', 'charlie', 'delta']
print(ft.reduce(lambda x, y: x + ("." if x else "") + y[0], data, ""))
# a.b.c.d
现在,最后一个空字符串将是第一次迭代中x的第一个值.我们用.只有当x不是空字符串时否则我们使用空字符串,这样连接就会得到你想要的结果.