在 python 中使用 reduce() 序列化字符串
Posted
技术标签:
【中文标题】在 python 中使用 reduce() 序列化字符串【英文标题】:Serialize a string using reduce() in python 【发布时间】:2020-02-16 22:12:57 【问题描述】:我正在尝试学习在 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
有人能指出原因吗?提前致谢!
【问题讨论】:
【参考方案1】: 每次当前迭代的reduce
函数都依赖于先前的项目/计算(所有 reduce 例程的性质),这就是您在开始时得到 12
的原因结果字符串:在第一次通过时,项目为 5~geeks3~are
,长度为 12
,并在下一次迭代中使用/添加。
相反,您可以使用简单的连续方法:
lst = ["geeks", "are", "awesome"]
res = ''.join('~'.format(str(len(s)), s) for s in lst)
print(res) # 5~geeks3~are7~awesome
【讨论】:
【参考方案2】:您需要在reduce()
函数中添加initializer
参数 - 一个空字符串。它将是列表中的值之前传递给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
【讨论】:
【参考方案3】:reduce
函数用于聚合。您正在尝试做的是映射。
你可以使用map
函数来达到目的:
''.join(map(lambda x: str(len(x)) + '~' + x, S))
这会返回:
5~geeks3~are7~awesome
【讨论】:
【参考方案4】: 这是pyton3.7+
使用fstring
的解决方案。
>>> S = ["geeks", "are", "awesome"]
>>> ''.join(f'len(s)~s' for s in S)
'5~geeks3~are7~awesome'
【讨论】:
以上是关于在 python 中使用 reduce() 序列化字符串的主要内容,如果未能解决你的问题,请参考以下文章