>>> 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'。不知何故,无法解释结果。这里有类似的问题,但不完全像这个。
答案 0 :(得分:5)
执行作为第一个参数传递的函数的结果将是下一次迭代中该函数的第一个参数。所以,你的代码就像这样
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
,否则我们使用空字符串,这样连接就会得到你想要的结果。
答案 1 :(得分:1)
如果您想使用reduce
,最优雅的方法是:
from functools import reduce
from operator import add
reduce(add, ['a', 'b', 'c']) # abc
否则,我认为您最好使用string.join
界面:
''.join(['a', 'b', 'c']) # abc
'.'.join(['a', 'b', 'c']) # a.b.c
答案 2 :(得分:1)
您也可以使用第一个字符的列表并添加元素以获得相同的结果
这是一个使用 map
的示例:
list1 = ['alfa', 'bravo', 'charlie', 'delta']
from functools import reduce
print(reduce(lambda x,y:x+y,map(lambda x:x[0],list1)))