Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何反转字符串的多片操作_Python_String - Fatal编程技术网

Python:如何反转字符串的多片操作

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

我正在研究一个有趣的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 = 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]