Python: reduce (list of strings) -> string
The result of executing the function passed as the first parameter, will be the first parameter to that function in the next iteration. So, your code works like this
lambda x, y: x[0] + "." + y[0]
When
x
,y
are'alfa'
and'bravo'
respectively,a.b
.Now,
x
will bea.b
andy
will be'charlie'
, so result will bea.c
Now,
x
will bea.c
andy
will be'delta'
, so result will bea.d
That is why the result is a.d
To get what you wanted, take all the first characters from all the strings to form a list and join all the elements together with .
, like this
print(".".join([item[0] for item in data]))
# a.b.c.d
Note: I won't prefer this way, but for the sake of completeness, you can do it with reduce
, like this
data = ['alfa', 'bravo', 'charlie', 'delta']
print(ft.reduce(lambda x, y: x + ("." if x else "") + y[0], data, ""))
# a.b.c.d
Now, the last empty string will be the first value for x
in the first iteration. And we use .
only if x
is not an empty string otherwise we use an empty string, so that the concatenation would give the result you wanted.
If you want to use the reduce
the most elegant way would be to do:
from functools import reduce
from operator import add
reduce(add, ['a', 'b', 'c']) # abc
Otherwise I think you better use the string.join
interface:
''.join(['a', 'b', 'c']) # abc
'.'.join(['a', 'b', 'c']) # a.b.c