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