【问题标题】:Serialize a string using reduce() in python在 python 中使用 reduce() 序列化字符串
【发布时间】: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

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

【问题讨论】:

    标签: python lambda reduce


    【解决方案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'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多