Python 如何让函数遍历字符串并替换字符串的第一个字符、第二个字符等?

Python 如何让函数遍历字符串并替换字符串的第一个字符、第二个字符等?,python,encryption,python-3.x,while-loop,iteration,Python,Encryption,Python 3.x,While Loop,Iteration,我正在尝试创建一个巴康密码加密程序,它读取消息、假消息和整数密钥的输入,然后通过凯撒密码加密程序输出假消息,但使用巴康密码的空格和符号表示粗体和普通字体,或者使用“a”和“B” 这是我到目前为止所拥有的。它基本上已经完成了,但是我不能让输出循环遍历用Caesar密码加密的字符串中的字符,相反,它只使用第一个字符。我很肯定这是件愚蠢的事,但我似乎无法让它发挥作用。有什么建议吗 def main(): myBaconianMessage = input('Please input Bacon

我正在尝试创建一个巴康密码加密程序,它读取消息、假消息和整数密钥的输入,然后通过凯撒密码加密程序输出假消息,但使用巴康密码的空格和符号表示粗体和普通字体,或者使用“a”和“B”

这是我到目前为止所拥有的。它基本上已经完成了,但是我不能让输出循环遍历用Caesar密码加密的字符串中的字符,相反,它只使用第一个字符。我很肯定这是件愚蠢的事,但我似乎无法让它发挥作用。有什么建议吗

def main():
    myBaconianMessage = input('Please input Bacon cipher message.')
    myBaconianMessage = myBaconianMessage.split()
    myCaesarMessage = input('Please input fake message to be encrypted.')
    myCaesarKey = int(input('Please input integer key.'))
    clues_A = {'A':'AAAAA'}
    clues_B = {'B':'AAAAB'}
    clues = {'a':'AAAAA', 'b':'AAAAB', 'c':'AAABA', 'd':'AAABB', 'e':'AABAA',
             'f':'AABAB', 'g':'AABBA', 'h':'AABBB', 'i':'ABAAA', 'j':'ABAAA',
             'k':'ABAAB', 'l':'ABABA', 'm':'ABABB', 'n':'ABBAA', 'o':'ABBAB',
             'p':'ABBBA', 'q':'ABBBB', 'r':'BAAAA', 's':'BAAAB', 't':'BAABA',
             'u':'BAABB', 'v':'BAABB', 'w':'BABAA', 'x':'BABAB', 'y':'BABBA',
             'z':'BABBB', 'C':'AAABA', 'D':'AAABB', 'E':'AABAA', 'F':'AABAB',
             'G':'AABBA', 'H':'AABBB', 'I':'ABAAA', 'J':'ABAAA', 'K':'ABAAB',
             'L':'ABABA', 'M':'ABABB', 'N':'ABBAA', 'O':'ABBAB', 'P':'ABBBA',
             'Q':'ABBBB', 'R':'BAAAA', 'S':'BAAAB', 'T':'BAABA', 'U':'BAABB',
             'V':'BAABB', 'W':'BABAA', 'X':'BABAB', 'Y':'BABBA', 'Z':'BABBB'}


    def decrypter():
        translated = myBaconianMessage[:]
        for i, word in enumerate(translated):
            for key in clues_A:
                translated[i] = translated[i].replace(key, clues_A.get(key))
            for key in clues_B:
                translated[i] = translated[i].replace(key, clues_B.get(key))
            for key in clues:
                translated[i] = translated[i].replace(key, clues.get(key))
        encryptedMessage = ''.join(translated)
        return encryptedMessage


    def caesarPortion():
        myCaesarMode = 'encrypt'
        alphabet = 'abcdefghijklmnopqrstuvwxyz'
        caesarMessage = ''
        newCaesarMessage = myCaesarMessage.lower()
        for symbol in newCaesarMessage:
            if symbol in alphabet:
                num = alphabet.find(symbol)
                if myCaesarMode == 'encrypt':
                    num = num + myCaesarKey
                elif myCaesarMode == 'decrypt':
                    num = num - myCaesarKey
                if num >= len(alphabet):
                    num = num - len(alphabet)
                elif num < 0:
                    num = num + len(alphabet)
                caesarMessage = caesarMessage + alphabet[num]
        else:
            caesarMessage = caesarMessage + symbol
        thisCaesarMessage = ''.join(caesarMessage)
        return thisCaesarMessage


    def doubleEncrypted():
        caesar = caesarPortion()
        listCaesar = list(caesar)
        translate = decrypter()
        listTranslate = translate.split()
        for char in range(len(listCaesar) - 1):
            i = 0
            while i <= len(listCaesar):
                i += 1
                set = {'A':listCaesar[i], 'B':' '}
                for symbol in listTranslate:
                    for x, word in enumerate(listTranslate):
                        for key in set:
                            listTranslate[x] = listTranslate[x].replace(key,  ''.join(str(set.get(key))))
    return listTranslate

    if len(myBaconianMessage) >= 1:
        print(''.join(doubleEncrypted()))

if __name__ == '__main__':
    main()
def main():
MyBaconionMessage=input('请输入Bacon密码消息')
myBaconianMessage=myBaconianMessage.split()
myCaesarMessage=input('请输入要加密的假消息')
myCaesarKey=int(输入('请输入整数键'))
线索A={'A':'AAAAA'}
线索B={'B':'AAAAB'}
线索={'a':'AAAAA','b':'AAAAB','c':'AAABA','d':'AAABB','e':'AABAA',
‘f’:‘AABAB’,‘g’:‘AABBA’,‘h’:‘AABBB’,‘i’:‘ABAAA’,‘j’:‘ABAAA’,
‘k’:‘ABABA’,‘l’:‘ABABA’,‘m’:‘ABABB’,‘n’:‘ABBAA’,‘o’:‘ABABB’,
‘p’:‘ABBBA’,‘q’:‘ABBBB’,‘r’:‘BAAAA’,‘s’:‘BAAAB’,‘t’:‘BAABA’,
‘u’:‘BAABB’,‘v’:‘BAABB’,‘w’:‘BABAA’,‘x’:‘BABAB’,‘y’:‘BABBA’,
‘z’:‘BABBB’,‘C’:‘AAABA’,‘D’:‘AAABB’,‘E’:‘AABAA’,‘F’:‘AABAB’,
‘G’:‘AABBA’,‘H’:‘AABBB’,‘I’:‘ABAAA’,‘J’:‘ABAAA’,‘K’:‘ABAAB’,
‘L’:‘ABABA’,‘M’:‘ABABB’,‘N’:‘ABBAA’,‘O’:‘ABBAB’,‘P’:‘ABBBA’,
‘Q’:‘abbb’,‘R’:‘BAAAA’,‘S’:‘BAAAB’,‘T’:‘BAABA’,‘U’:‘BAABB’,
‘V’:‘babb’,‘W’:‘BABAA’,‘X’:‘BABAB’,‘Y’:‘BABBA’,‘Z’:‘BABBB’}
def decrypter():
翻译=MyBaconionMessage[:]
对于i,枚举中的单词(翻译):
对于输入A的键:
已翻译的[i]=已翻译的[i]。替换(键,线索A.get(键))
有关输入线索,请参见:
已翻译的[i]=已翻译的[i]。替换(键,线索获取(键))
有关关键线索:
已翻译[i]=已翻译[i]。替换(键,线索。获取(键))
encryptedMessage=''.join(已翻译)
返回加密消息
def caesarpart():
mymode='encrypt'
字母表='abcdefghijklmnopqrstuvxyz'
消息=“”
newCaesarMessage=myCaesarMessage.lower()
对于新邮件中的符号:
如果字母表中有符号:
num=字母表。查找(符号)
如果mymode=='encrypt':
num=num+mykey
elif myCaesarMode==“解密”:
num=num-mykey
如果num>=len(字母表):
num=num-len(字母表)
elif num<0:
num=num+len(字母表)
caesarMessage=caesarMessage+字母表[num]
其他:
凯撒消息=凯撒消息+符号
thisCaesarMessage=''。加入(caesarMessage)
返回此消息
def doubleEncrypted():
凯撒
listCaesar=列表(caesar)
translate=解密程序()
listTranslate=translate.split()
对于范围内的字符(len(listCaesar)-1):
i=0
当i=1时:
打印(“”.join(doubleEncrypted()))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

我知道这是doubleEncrypted()中的问题,可能是while循环、set或range,我知道代码一点也不优雅,但我是n00b,我只是想弄清楚事情是如何工作的。我真的非常感谢您的建议。

是的,问题出在带有while循环的
双重加密
函数中:

# this while loop will loop from `i` is incremented before indexing 
while i <= len(listCaesar):

我知道这已经晚了7年,但这是一个非常有效的巴康尼亚学说: 它编码和解码:

What = int(input("Would you like to... 1. Encode, or 2. Decode? "))

if What == 1:
  Input = str(input("")).upper()
  BaconianTable = {
    "A": "AAAAA ",
    "B": "AAAAB ",
    "C": "AAABA ",
    "D": "AAABB ",
    "E": "AABAA ",
    "F": "AABAB ",
    "G": "AABBA ",
    "H": "AABBB ",
    "I": "ABAAA ",
    "J": "ABAAA ",
    "K": "ABAAB ",
    "L": "ABABA ",
    "M": "ABABB ",
    "N": "ABBAA ",
    "O": "ABBAB ",
    "P": "ABBBA ",
    "Q": "ABBBB ",
    "R": "BAAAA ",
    "S": "BAAAB ",
    "T": "BAABA ",
    "U": "BAABB ",
    "V": "BAABB ",
    "W": "BABAA ",
    "X": "BABAB ",
    "Y": "BABBA ",
    "Z": "BABBB ",
    " ": " ",
    ".": ".",
    ",": ",",
    "!": "!",
    "?": "?"
  }

  X = list(Input)
  Answer = ""
  Y = 0
  for i in range(len(Input)):
    Answer = Answer + str(BaconianTable[X[Y]])
    Y += 1
  print(Answer)
elif What == 2:
  Input = str(input("")).upper()
  Input = Input.replace("AAAAA", "a")
  Input = Input.replace("AAAAB", "b")
  Input = Input.replace("AAABA", "c")
  Input = Input.replace("AAABB", "d")
  Input = Input.replace("AABAA", "e")
  Input = Input.replace("AABAB", "f")
  Input = Input.replace("AABBA", "g")
  Input = Input.replace("AABBB", "H")
  Input = Input.replace("ABAAA", "|i (or) j|")
  Input = Input.replace("ABAAB", "k")
  Input = Input.replace("ABABA", "l")
  Input = Input.replace("ABABB", "m")
  Input = Input.replace("ABBAA", "n")
  Input = Input.replace("ABBAB", "o")
  Input = Input.replace("ABBBA", "p")
  Input = Input.replace("ABBBB", "q")
  Input = Input.replace("BAAAA", "r")
  Input = Input.replace("BAAAB", "s")
  Input = Input.replace("BAABA", "t")
  Input = Input.replace("BAABB", "|u (or) v|")
  Input = Input.replace("BABAA", "w")
  Input = Input.replace("BABAB", "x")
  Input = Input.replace("BABBA", "y")
  Input = Input.replace("BABBB", "z")
  Input = Input.replace("  ", "+")
  Input = Input.replace(" ", "")
  Input = Input.replace("+", " ")    
  print(Input.capitalize())

您好,您的代码段缩进是否正确,所有函数都在main中?或者如果是,为什么这样写。是的,这似乎是让main()继续执行CaesarPartion()的唯一方法…非常确定有一种不同的、正确的方法,但我不知道它是什么。我这样做了,但现在我不断得到错误:索引器:列表索引超出范围。你做了哪一个,你能打印I,listCaesar[I]就在while循环之前?我想看看最后一个i,与列表的长度相比,我只是把i+=1放在set={…等后面,因为我需要它以我希望的方式在我的代码中运行…这是错误的吗?问题是,你正在尝试索引一个超出范围的列表,例如,你有一个大小=4的列表,list=[1,2,3,4],list[3]=4,因为列表索引从0开始,所以如果在索引之前增加i,它将始终超出列表大小。因为您在列表长度-1的范围内循环。因此,如果在设置后放置i+=1,则将while循环更改为

>>> for char in range(6 - 1):
...     i = 0
...     while i < 6:       # while i <=5:
...         print i, listCaesar[i]
...         i += 1
...
0 M
1 y
2 N
3 a
4 m
What = int(input("Would you like to... 1. Encode, or 2. Decode? "))

if What == 1:
  Input = str(input("")).upper()
  BaconianTable = {
    "A": "AAAAA ",
    "B": "AAAAB ",
    "C": "AAABA ",
    "D": "AAABB ",
    "E": "AABAA ",
    "F": "AABAB ",
    "G": "AABBA ",
    "H": "AABBB ",
    "I": "ABAAA ",
    "J": "ABAAA ",
    "K": "ABAAB ",
    "L": "ABABA ",
    "M": "ABABB ",
    "N": "ABBAA ",
    "O": "ABBAB ",
    "P": "ABBBA ",
    "Q": "ABBBB ",
    "R": "BAAAA ",
    "S": "BAAAB ",
    "T": "BAABA ",
    "U": "BAABB ",
    "V": "BAABB ",
    "W": "BABAA ",
    "X": "BABAB ",
    "Y": "BABBA ",
    "Z": "BABBB ",
    " ": " ",
    ".": ".",
    ",": ",",
    "!": "!",
    "?": "?"
  }

  X = list(Input)
  Answer = ""
  Y = 0
  for i in range(len(Input)):
    Answer = Answer + str(BaconianTable[X[Y]])
    Y += 1
  print(Answer)
elif What == 2:
  Input = str(input("")).upper()
  Input = Input.replace("AAAAA", "a")
  Input = Input.replace("AAAAB", "b")
  Input = Input.replace("AAABA", "c")
  Input = Input.replace("AAABB", "d")
  Input = Input.replace("AABAA", "e")
  Input = Input.replace("AABAB", "f")
  Input = Input.replace("AABBA", "g")
  Input = Input.replace("AABBB", "H")
  Input = Input.replace("ABAAA", "|i (or) j|")
  Input = Input.replace("ABAAB", "k")
  Input = Input.replace("ABABA", "l")
  Input = Input.replace("ABABB", "m")
  Input = Input.replace("ABBAA", "n")
  Input = Input.replace("ABBAB", "o")
  Input = Input.replace("ABBBA", "p")
  Input = Input.replace("ABBBB", "q")
  Input = Input.replace("BAAAA", "r")
  Input = Input.replace("BAAAB", "s")
  Input = Input.replace("BAABA", "t")
  Input = Input.replace("BAABB", "|u (or) v|")
  Input = Input.replace("BABAA", "w")
  Input = Input.replace("BABAB", "x")
  Input = Input.replace("BABBA", "y")
  Input = Input.replace("BABBB", "z")
  Input = Input.replace("  ", "+")
  Input = Input.replace(" ", "")
  Input = Input.replace("+", " ")    
  print(Input.capitalize())