Este escrito ha sido probado por expertos para asegurar la veracidad de este ensayo.
Solución:
El resultado de ejecutar la función pasada como primer parámetro, será el primer parámetro de esa función en la siguiente iteración. Entonces, tu código funciona así
lambda x, y: x[0] + "." + y[0]
-
Cuando
x
,y
son'alfa'
y'bravo'
respectivamente,a.b
. -
Ahora,
x
estarána.b
yy
estarán'charlie'
por lo que el resultado seráa.c
-
Ahora,
x
estarána.c
yy
estarán'delta'
por lo que el resultado seráa.d
Por eso el resultado es a.d
Para obtener lo que quería, tome todos los primeros caracteres de todas las cadenas para formar una lista y junte todos los elementos con .
como esto
print(".".join([item[0] for item in data]))
# a.b.c.d
Nota: No preferiré de esta manera, pero en aras de la exhaustividad, puede hacerlo con reduce
como esto
data = ['alfa', 'bravo', 'charlie', 'delta']
print(ft.reduce(lambda x, y: x + ("." if x else "") + y[0], data, ""))
# a.b.c.d
Ahora, el último vacío string será el primer valor para x
en la primera iteración. y usamos .
sólo si x
no es un vacío string de lo contrario usamos un vacío stringpara que la concatenación diera el resultado que querías.
Si desea utilizar el reduce
la forma más elegante sería hacer:
from functools import reduce
from operator import add
reduce(add, ['a', 'b', 'c']) # abc
De lo contrario, creo que es mejor que uses el string.join
interfaz:
''.join(['a', 'b', 'c']) # abc
'.'.join(['a', 'b', 'c']) # a.b.c
Si te gusta la informática, puedes dejar una reseña acerca de qué te ha impresionado de esta división.