首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python中的还原()序列化字符串

使用python中的还原()序列化字符串
EN

Stack Overflow用户
提问于 2019-10-20 18:10:08
回答 4查看 79关注 0票数 1

我正在尝试学习用python处理事情的函数式编程方法。我试图使用以下代码序列化python中的字符串列表

代码语言:javascript
复制
S = ["geeks", "are", "awesome"]
reduce(lambda x, y: (str(len(x)) + '~' + x) + (str(len(y)) +  '~' + y), S)

我期待:

代码语言:javascript
复制
5~geeks3~are7~awesome

但我看到:

代码语言:javascript
复制
12~5~geeks3~are7~awesome

有人能指出原因吗?提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-20 19:09:44

您需要将initializer参数-一个空字符串添加到reduce()函数中。它将是在列表中的值之前传递给lambda函数的第一个参数。

代码语言:javascript
复制
from functools import reduce

S = ["geeks", "are", "awesome"]

reduce(lambda x, y: x + f'{len(y)}~{y}', S, '')
# 5~geeks3~are7~awesome

相当于:

代码语言:javascript
复制
((('' + '5~geeks') + '3~are') + '7~awesome')
# 5~geeks3~are7~awesome
票数 1
EN

Stack Overflow用户

发布于 2019-10-20 18:20:40

当前每个迭代上的reduce函数依赖于以前的项/计算(所有缩减例程的性质),这就是为什么在结果字符串开始时获得12的原因:在第一次传递时,条目是带有长度125~geeks3~are,在下一次迭代中使用/加了它。

相反,您可以使用简单的连续方法:

代码语言:javascript
复制
lst = ["geeks", "are", "awesome"]
res = ''.join('{}~{}'.format(str(len(s)), s) for s in lst)
print(res)    # 5~geeks3~are7~awesome
票数 2
EN

Stack Overflow用户

发布于 2019-10-20 18:19:09

reduce函数用于聚合。你想要做的是映射。

您可以将map函数用于以下目的:

代码语言:javascript
复制
''.join(map(lambda x: str(len(x)) + '~' + x, S))

这将返回:

代码语言:javascript
复制
5~geeks3~are7~awesome
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58475837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档