python join、map 和 lambda 方法
python join,map and lambda methods
我对 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)
这是您的代码的简化版本,您应该能够遵循:
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'
要点
y
是 s
长度的 rounded-up 平方根,在本例中 sqrt(5) 向上取整为 3。
lambda
是一个匿名函数,它映射 range(y)
中的每个值,即 0, 1, 2
映射到 s[x::y]
,即 return 每 y
从索引 x
开始的序列的第一个元素。另见 Understanding Python's slice notation。 x
是 range(y)
. 成员的任意符号
- 将所有结果值与 space 连接起来形成一个字符串。
- 在您的原始代码中,
{0}
和 str.format
用于在一行中将 y
合并到您的字符串中。在这种情况下,我认为这是令人费解的错误做法。
此行在字符串上使用 format()
函数。
因此,{0}
将被格式函数中的第一个元素替换,即 ceil(sqrt(len(s))))
从 documetnation 你可以看到 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))))
当使用str.format()方法时(see here),其中的括号和字符将替换为方法中传递的对象。 “0”表示替换为方法中传递的第一个字符。
我对 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)
这是您的代码的简化版本,您应该能够遵循:
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'
要点
y
是s
长度的 rounded-up 平方根,在本例中 sqrt(5) 向上取整为 3。lambda
是一个匿名函数,它映射range(y)
中的每个值,即0, 1, 2
映射到s[x::y]
,即 return 每y
从索引x
开始的序列的第一个元素。另见 Understanding Python's slice notation。x
是range(y)
. 成员的任意符号
- 将所有结果值与 space 连接起来形成一个字符串。
- 在您的原始代码中,
{0}
和str.format
用于在一行中将y
合并到您的字符串中。在这种情况下,我认为这是令人费解的错误做法。
此行在字符串上使用 format()
函数。
因此,{0}
将被格式函数中的第一个元素替换,即 ceil(sqrt(len(s))))
从 documetnation 你可以看到 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))))
当使用str.format()方法时(see here),其中的括号和字符将替换为方法中传递的对象。 “0”表示替换为方法中传递的第一个字符。