python 连接、映射和 lambda 方法

新手上路,请多包涵

我对 python 很陌生。有人可以解释这一行

exec("print(' '.join(map(lambda x: s[x::{0}], range({0}))))".format(ceil(sqrt(len(s)))))

s[x::{0}]range({0})) 是什么意思?

在下面的一段代码中详细介绍?

此代码是以下 hackerrank 问题的解决方案: https ://www.hackerrank.com/challenges/encryption/problem

 #!/bin/python3

import sys
from math import ceil, floor, sqrt

def encryption(s):
    exec("print(' '.join(map(lambda x: s[x::{0}], range({0}))))".format(ceil(sqrt(len(s)))))

if __name__ == "__main__":
    s = input().strip()
    result = encryption(s)

原文由 pythonaddict 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 745
2 个回答

这是您的代码的简化版本,您应该能够遵循:

 from math import ceil, sqrt

s = 'hello'

y = ceil(sqrt(len(s)))
# 3

res = ' '.join(map(lambda x: s[x::y], range(y)))
# 'hl eo l'

要点

  • ys 长度的四舍五入平方根,在本例中 sqrt(5) 向上舍入为 3。
  • lambda is an anonymous function which maps each value in range(y) , ie 0, 1, 2 is mapped to s[x::y] , ie return every y 从索引 x 开始的序列的第一个元素。另请参阅 了解 Python 的切片表示法xrange(y) 成员的任意符号。
  • 使用空格连接所有结果值以形成单个字符串。
  • 在您的原始代码 {0}str.format 用于将 y 合并到一行中的字符串中。在这种情况下,我认为这是令人费解的不良做法。

原文由 jpp 发布,翻译遵循 CC BY-SA 3.0 许可协议

当使用 str.format() 方法时( 见这里),其中的括号和字符将被替换为方法中传递的对象。 “0”表示替换为方法中传递的第一个字符。

原文由 Jonathan S. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题