【问题标题】:How do I get a function to iterate through a string and replace the first character of a string, second, etc?如何获得一个函数来遍历字符串并替换字符串的第一个字符、第二个字符等?
【发布时间】:2014-03-07 06:27:31
【问题描述】:

我正在尝试创建一个培根密码加密程序,该程序读取消息的输入、假消息和整数密钥,然后输出通过凯撒密码加密程序转换的假消息,但带有空格和符号代表粗体和普通字体的培根密码,或者我使用的“A”和“B”。

这是我目前所拥有的。它已基本完成,但我无法让输出循环遍历使用凯撒密码加密的字符串中的字符,而是仅使用第一个字符。我很肯定这很愚蠢,但我似乎无法让它发挥作用。有什么建议? :

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()

我知道问题出在 doubleEncrypted() 中,可能是 while 循环或集合或范围,我知道代码确实一点也不优雅,但我是一个 n00b,我只是在尝试弄清楚事情是如何运作的。我真的非常感谢任何建议。

【问题讨论】:

  • 您好,您的 sn-p 缩进是否正确,所有功能都在 main 中?或者如果是,为什么你这样写。
  • 是的,这似乎是让 main() 继续执行 caesarPortion() 的唯一方法......很确定有一种不同的正确方法,但我没有知道它是什么。

标签: python encryption python-3.x while-loop iteration


【解决方案1】:

是的,问题出在 doubleEncrypted 函数内部,带有 while 循环:

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

这里是一个例子 sn-p:

>>> listCaesar = 'MyName'
>>> len(listCaesar)
6
>>> range(6 - 1)
[0, 1, 2, 3, 4]
>>> for char in range(6 - 1):
...     i = 0
...     while i <= 6:
...         i += 1
...         print i, listCaesar[i]
...
1 y
2 N
3 a
4 m
5 e
6
Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
IndexError: string index out of range
>>>

在上面的例子中,i 在索引之前是递增的,所以当它达到 6 时,列表索引超出范围。

因此,您可以通过在 listCaesar 索引后添加 i += 1 来解决此问题。即使我觉得这是正确的方法,因为您在索引之后而不是之前递增 i

>>> 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

【讨论】:

  • 我这样做了,但现在我不断收到错误:IndexError: list index out of range.
  • 你做了哪一个,你能在 while 循环之前打印 i, listCaesar[i] 吗?我想看看最后一个 i,与 listCaesar 的长度相比
  • 我只是将 i += 1 放在 set = {...etc 之后,因为我需要它以我希望的方式在我的代码中运行...这是错的吗?
  • 看看问题,你是否试图索引一个超出范围的列表意味着例如你有一个大小= 4,列表= [1,2,3,4],列表的列表[3] = 4,因为列表索引从 0 开始,所以如果在索引之前增加 i,它将始终超出列表大小。当您在列表长度范围内循环时 - 1.
  • 所以,如果你把 i += 1 放在 set 之后,那么将 while 循环更改为 &lt; 而不是 &lt;=
【解决方案2】:

我知道这已经晚了 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())

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2018-04-23
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多