Python:如何反转字符串的多片操作
我正在研究一个有趣的Python编码问题: 从字符串中每隔2个字符获取一个字符,然后是其他字符(不是每2个字符),并将它们作为新字符串进行合并。 这样做n次 例如: “这是一个测试!”,1->“hsi etTi sats!” “这是一个测试!”,2->“hsi etTi sats!”->“s eT ashi tist!” 我写的函数是:Python:如何反转字符串的多片操作,python,string,Python,String,我正在研究一个有趣的Python编码问题: 从字符串中每隔2个字符获取一个字符,然后是其他字符(不是每2个字符),并将它们作为新字符串进行合并。 这样做n次 例如: “这是一个测试!”,1->“hsi etTi sats!” “这是一个测试!”,2->“hsi etTi sats!”->“s eT ashi tist!” 我写的函数是: def encrypt(text, n): if n <= 0: return text else: a
def encrypt(text, n):
if n <= 0:
return text
else:
a = encrypt(text, n-1)[1::2]
b = encrypt(text, n-1)[::2]
return a+b
如何操作a和b以恢复字符串?我不确定我是否已经澄清了自己
提前感谢您的时间。这只是对字符串的
zip
操作。但是,您不能直接使用zip
,需要将其格式化为字符串
s = "ABCDEF"
a = s[1::2]
b = s[::2]
print(a,b)
s2 = "".join(["{0}{1}".format(x, y) for (x, y) in zip(b, a)])
print(s2)
>>> BDF ACE
>>> ABCDEF
您可以使用
map
将b
和a
的元素成对连接起来,从而生成长度为2的字符串列表。然后使用join
将它们连接到原始字符串中:
a = "BDF"
b = "ACE"
s = "".join(map(lambda x,y: x+y, b, a))
使用
zip
可以同时循环浏览两个列表。通过将end=”“
添加到print
功能,它将继续在同一行进行打印
这应该起作用:
expression="This is a test!"
first=expression[1::2]
second=expression[::2]
for i,j in zip(first,second):
print(j+i,end="")
因此,输出为:
This is a test
其他一些答案在整个问题中缺少两个重要方面
- 当字符数为奇数时会发生什么情况?如果长度不等的序列
或zip
将缺少最后一个字符map
- 递归加密呢
def encrypt(text, n):
if n <= 0:
return text
else:
a = encrypt(text, n-1)[1::2]
b = encrypt(text, n-1)[::2]
return a+b
def decrypt(text, n):
if n <= 0:
return text
else:
a, b = text[:len(text)//2], text[len(text)//2:]
text = "".join(map(lambda x, y: x + y, b, a))
text = decrypt(text, n-1)
if len(b) > len(a):
# happens for odd number of characters. We need to append last from b
text += b[-1]
return text
s = "This is a test!"
print("n=1: {0}".format(decrypt(encrypt(s, 1), 1)))
print("n=2: {0}".format(decrypt(encrypt(s, 2), 2)))
print("n=3: {0}".format(decrypt(encrypt(s, 3), 3)))
>>> n=1: This is a test!
>>> n=2: This is a test!
>>> n=3: This is a test!
def加密(文本,n):
如果n>>n=1:这是一个测试!
>>>n=2:这是一个测试!
>>>n=3:这是一个测试!
根据您的问题,我认为您希望创建一个单独的函数,用于解密使用加密函数加密的字符串。如果是这样,则可以执行类似以下操作:
def decrypt(text, n):
if n <= 0:
return text
else:
num = len(text) // 2
a = text[:num:]
b = text[num::]
answer = "".join(map(lambda x,y: x+y, b, a))
answer = decrypt(answer, n-1)
return answer if (len(text) % 2 == 0) else answer + b[-1]
def解密(文本,n):
如果n,则需要先将字符串一分为二,然后交替从两个字符串中提取字母。这样做n次是的,准确地说。我被困在从两个字符串部分交替提取字母上。我只是不知道怎么做哈哈。@ascriptor提供的答案应该被接受,因为它是第一个提供的,并且完全解决了这个问题。非常感谢你的帮助。我真的不知道zip函数。我没有先添加“end=''”就尝试了它,它只给了我多行的打印结果。此端=输入像一个符咒一样工作。它是如何做到这一点的?再次感谢!谢谢。请你解释一下什么是lambda,为什么在这个例子中使用它?谢谢老实说,我做梦也想不到比这更彻底、更全面的答案。非常感谢你,先生。作为一名python新手,我在这里学习了map和zip。但是你能解释一下(λx,y:x+y,b,a)对我来说意味着什么吗?或者,如果你能给我一些相关的材料来阅读,那也行。非常感谢你,先生!我确实读了一些关于映射函数和lambda的知识。但是为什么“.join(map(lambda x,y:x+y,b,a))可以工作,而直接使用map(lambda x,y:x+y,b,a)只会让我觉得毫无意义?对我来说,这似乎是多余的一步。谢谢。@Bowen:
map(lambda x,y:x+y,b,a)
生成一个列表(python2)或一个迭代器对象(python3)。结果的每个元素将是a
和b
的压缩元素之和。字符串的和是串联的。因此,在map
(或zip
)之后有一个由两个字符串组成的iterable。然后需要将这些2个字符的字符串依次放置。这就是join
所做的(这里用一个空字符串作为分隔符)。非常感谢。先生,你很擅长解释事情。我肯定会玩更多的地图和lambda游戏来更好地掌握它。非常感谢,但是你能解释一下格式部分吗?“s2=”“.join([“{0}{1}.”在zip(b,a)]中为(x,y)格式化(x,y)“)”谢谢。
def decrypt(text, n):
if n <= 0:
return text
else:
num = len(text) // 2
a = text[:num:]
b = text[num::]
answer = "".join(map(lambda x,y: x+y, b, a))
answer = decrypt(answer, n-1)
return answer if (len(text) % 2 == 0) else answer + b[-1]