Python:reduce(字符串列表) - > string

Ale*_*lov 5 python string reduce list python-3.x

>>> 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'
>>>
Run Code Online (Sandbox Code Playgroud)

我期待像'abcd'或'abcd'这样的东西.不知怎的,无法解释结果.这里有类似的问题,但不完全像这个.

the*_*eye 5

执行作为第一个参数传递的函数的结果将是下一次迭代中该函数的第一个参数.所以,你的代码就是这样的

lambda x, y: x[0] + "." + y[0]
Run Code Online (Sandbox Code Playgroud)
  1. x,y'alfa''bravo'分别a.b.

  2. 现在,xa.by'charlie',所以结果将是a.c

  3. 现在,xa.cy'delta',所以结果将是a.d

这就是结果的原因 a.d

为了得到你想要的东西,把所有字符串中的所有第一个字符组成一个列表并将所有元素连接在一起.,就像这样

print(".".join([item[0] for item in data]))
# a.b.c.d
Run Code Online (Sandbox Code Playgroud)

注:我不喜欢这种方式,但为了完整起见,你可以做到这一点reduce,像这样

data = ['alfa', 'bravo', 'charlie', 'delta']
print(ft.reduce(lambda x, y: x + ("." if x else "") + y[0], data, ""))
# a.b.c.d
Run Code Online (Sandbox Code Playgroud)

现在,最后一个空字符串将是第x一次迭代中的第一个值.我们.只使用if x不是空字符串,否则我们使用空字符串,这样连接就会得到你想要的结果.

  • @KlassIvan是的,但是建立列表可以使`str.join`运行得更快。 (2认同)

小智 5

如果你想使用reduce最优雅的方式就是这样做:

from functools import reduce
from operator import add

reduce(add, ['a', 'b', 'c']) # abc
Run Code Online (Sandbox Code Playgroud)

否则我认为你最好使用该string.join界面:

''.join(['a', 'b', 'c']) # abc 
'.'.join(['a', 'b', 'c']) # a.b.c 
Run Code Online (Sandbox Code Playgroud)