我正在尝试学习用python处理事情的函数式编程方法。我试图使用以下代码序列化python中的字符串列表
S = ["geeks", "are", "awesome"]
reduce(lambda x, y: (str(len(x)) + '~' + x) + (str(len(y)) + '~' + y), S)我期待:
5~geeks3~are7~awesome但我看到:
12~5~geeks3~are7~awesome有人能指出原因吗?提前感谢!
发布于 2019-10-20 19:09:44
您需要将initializer参数-一个空字符串添加到reduce()函数中。它将是在列表中的值之前传递给lambda函数的第一个参数。
from functools import reduce
S = ["geeks", "are", "awesome"]
reduce(lambda x, y: x + f'{len(y)}~{y}', S, '')
# 5~geeks3~are7~awesome相当于:
((('' + '5~geeks') + '3~are') + '7~awesome')
# 5~geeks3~are7~awesome发布于 2019-10-20 18:20:40
当前每个迭代上的reduce函数依赖于以前的项/计算(所有缩减例程的性质),这就是为什么在结果字符串开始时获得12的原因:在第一次传递时,条目是带有长度12的5~geeks3~are,在下一次迭代中使用/加了它。
相反,您可以使用简单的连续方法:
lst = ["geeks", "are", "awesome"]
res = ''.join('{}~{}'.format(str(len(s)), s) for s in lst)
print(res) # 5~geeks3~are7~awesome发布于 2019-10-20 18:19:09
reduce函数用于聚合。你想要做的是映射。
您可以将map函数用于以下目的:
''.join(map(lambda x: str(len(x)) + '~' + x, S))这将返回:
5~geeks3~are7~awesomehttps://stackoverflow.com/questions/58475837
复制相似问题