Python的join、map和lambda方法

5

我对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)
4个回答

5
这是您的代码的简化版本,您应该能够跟随:
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 是一个匿名函数,它将 range(y) 中的每个值(即 0, 1, 2)映射到 s[x::y],即从索引 x 开始返回每个第 y 个元素。另请参见理解 Python 的切片符号。其中 xrange(y) 的成员任意标记。
  • 使用空格连接所有结果值以形成单个字符串。
  • 在您的原始代码中,{0}str.format 用于在一行中将 y 合并到您的字符串中。在这种情况下,我认为它很复杂且不好的做法。

这里的x代表什么意思?在range(y)中的每个值,即0、1、2都被映射到s[x::y],即从索引x开始返回序列的每个第y个元素。在这种情况下,lambda函数映射是如何进行的? - pythonaddict
抱歉,我现在明白了。就像对于列表的每个元素,从当前元素(x)迭代到范围(y)。因此,第一次迭代将产生hel,第二次将产生lo。当我们执行“”.join(hel,lo)时,它将产生“hl eo l”。 - pythonaddict

1
这行代码使用了format()函数来处理字符串。 因此,{0}将会被替换成ceil(sqrt(len(s))))函数中的第一个元素。

1
使用str.format()方法(在这里查看)时,括号和其中的字符将被替换为方法中传递的对象。 "0"表示用方法中传递的第一个字符进行替换。

0
文档中,您可以了解到format()的作用。
在您的示例中:
exec("print(' '.join(map(lambda x: s[x::{0}], range({0}))))".format(ceil(sqrt(len(s)))))

你在两个地方插入了 ceil(sqrt(len(s))) 的结果,即:
lambda x: s[x::ceil(sqrt(len(s)))]

并且

range(ceil(sqrt(len(s))))

现在,可以使用简单的变量避免在此处使用exec
def encryption(s):
    var = ceil(sqrt(len(s)))
    print(' '.join(map(lambda x: s[x::var], range(var))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接