更改字符串的字母

时间:2017-02-08 01:53:55

标签: python

我必须编写一个代码,将字符串(密码)的每个字母移动到字母表中的给定数字(shift)。我到目前为止编写的代码如下(有一个测试函数的例子):

    def decode(cipher, shift):
        letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        for letter in cipher:
            index = letters.index(letter)
            cipher = cipher.replace(letter, letters[index-shift])
        return cipher
    print decode("LIPPSASVPH", 4)

它几乎可以工作,除了正在发生的事情是,当代码通过密码运行时,它将更改任何与当前正在更改的字母匹配的字母,因此对于我的示例,它应该返回“HELLOWORLD”但它返回“DELLOWORLD”因为密码的最后一个字母是H,并且代码先前在密码的开头将L改为H,所以代码将H改为D'。有关如何在不更改其他字母的情况下单独在每个字母上运行代码的任何建议吗?非常感谢大家。

5 个答案:

答案 0 :(得分:1)

您可以使用新变量来存储结果并将其返回

def decode(cipher, shift):
    letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    result = ''
    for letter in cipher:
        index = letters.index(letter)
        result += letters[index - shift]
        # cipher = cipher.replace(letter, letters[index - shift])
    return result
print decode("LIPPSASVPH", 4)

答案 1 :(得分:1)

您可以创建一个新变量来保存结果,而不是更改密码。这样的事情可以解决问题:

def decode(cipher, shift):
  result = ""
  letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  for letter in cipher:
      index = letters.index(letter)
      #cipher = cipher.replace(letter, letters[index-shift])
      result += letters[index-shift]
return result
print (decode("LIPPSASVPH", 4))

答案 2 :(得分:1)

当您使用L时,您将替换字符串中的每个Dstr.replace等。你可以尝试这样的事情:

def decode(cipher, shift):
    letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    new_cipher = []
    for letter in cipher:
        new_cipher.append(letters[letters.index(letter)-shift])
    return ''.join(new_cipher)

您基本上可以找到相应的代码字母并将其附加到列表中。最后,使用''.join()将有序列表元素转换为字符串。

结果:

>>> decode("LIPPSASVPH", 4)
'HELLOWORLD'

编辑:这是一个单行(好吧,新密码的创建):

>>> letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> cipher = 'LIPPSASVPH'
>>> shift = 4
>>> new_cipher = ''.join(letters[letters.index(letter)-shift] for letter in cipher)

答案 3 :(得分:0)

您的代码似乎正在修改字符串。另一种方法是将字符串转换为列表并以这种方式修改元素。它可以帮助您减少功能,以简化调试。

x = "Hello"
y = list(x)
# y is now ['H', 'e', 'l', 'l', 'o']
y[1] = 'i'
# y is now ['H', 'i', 'l', 'l', 'o']
x = str(y)

答案 4 :(得分:0)

您可以像其他人建议的那样在新变量中构建结果,但我的直觉是采用完全不同的方法。我会使用maketrans()将密文映射到明文,然后使用translate()进行解密:

>>> from string import maketrans
>>>
>>> def decode(cipher, shift):
...     letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
...     shift = shift % len(letters)
...     mapping = maketrans(letters[shift:] + letters[:shift], letters)
...     return cipher.translate(mapping)
...
>>> print decode("LIPPSASVPH", 4)
HELLOWORLD