繁体   English   中英

在Python中实现Caesar密码算法

[英]Implementing the Caesar cipher algorithm in Python

因此,我正在尝试编写一个代码,以将单词中的每个字母向后移字母表中的多个字母(最后环绕)。 例如,如果我想移动2并输入CBE,我应该得到AZC。 或JOHN进入HMFL。 我有一个仅能处理一个字母的代码,而且我想知道是否有一种方法可以为python做一个嵌套的for循环(行得通吗?)

def move(word, shift):
  alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
  original = ""
  for letter in range(26, len(alphabet)):
    if alphabet[letter] == word: #this only works if len(word) is 0, I want to be able to iterate over the letters in word.
        original += alphabet[letter-shift]
  return original

你可以这样开始

def move(word, shift):
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    return "".join([alphabet[alphabet.find(i)-shift] for i in word])

基本上,此列表理解将构造单个字母的列表。 然后,通过.find方法找到字母表中字母的索引。 (index-shift)是所需的新索引,它是从字母中提取的。 结果列表再次加入并返回。

请注意,它显然不适用于小写输入字符串(如果要使用str.upper方法)。 实际上,该单词仅应包含字母中存在的字母。 对于句子,该方法需要区别对待空白。

不要以这种方式在字母找到字母-通过索引操作找到它。 char作为有问题的字母:

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
...
char_pos = alphabet.index(char)
new_pos = (char_pos - shift) % len(alphabet)
new_char = alphabet[new_pos]

了解这一点后,您可以将这三行折叠为一行。

现在,要使其对整个单词都起作用...

new_word = ""
for char in word:
    # insert the above logic
    new_word += new_char

你能把所有这些放在一起吗?

您仍然需要检查以确认char是字母。 另外,如果您有兴趣,可以为所有已翻译的字符建立列表理解,并应用''.join()获取新单词。

例如 ...

如果字母在字母表中(如果在字母中为char),则移动给定的距离并获取新字母,如果需要,将其环绕在末尾(%26)。 如果不是大写字母,请使用原始字符。

从所有这些翻译中列出一个清单,然后将它们加入一个字符串中。 返回该字符串。

def move(word, shift):
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    return ''.join([alphabet[(alphabet.find(char) - shift) % 26]
               if char in alphabet else char 
               for char in word])

print move("IBM", 1)
print move("The 1812 OVERTURE is COOL!", 13)

输出:

HAL
Ghe 1812 BIREGHER is PBBY!
A_VAL = ord('a')

def move(word, shift):
    new_word = ""
    for letter in word:
        new_letter = ord(letter) - shift
        new_word += chr(new_letter) if (new_letter >= A_VAL) else (26 + new_letter)
    return new_word

请注意,这仅适用于小写单词。 一旦开始混合使用大写和小写字母,就需要开始检查它们。 但这是一个开始。 我放弃了嵌套循环的想法,因为如果可能的话,您应该避免使用它们。

您可以使用: chr()为您提供一个数字的字符, ord()为您提供一个匹配字符的数字。

这是一个旧的Vigenere项目:

def code_vigenere(ch,cle):
    text = ch.lower()
    clef = cle.lower()
    L = len(cle)
    res = ''

    for i,l in enumerate(text):
        res += chr((ord(l) - 97 + ord(cle[i%L]) - 97)%26 +97)

    return res

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM