Python中的凯撒密码:删除列表中的空格

snz8szmq  于 2023-05-21  发布在  Python
关注(0)|答案(2)|浏览(139)

我在做一个凯撒密码的项目。我接受用户的输入,把它变成一个列表,去掉空格,然后加密字母。
我的问题是:如何将这些空格重新添加到最终的加密消息中?
以下是我迄今为止所取得的成就(假装单词=消息)

alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

en_de = input("Do you want to encrypt or decrypt your message? ")
word = input("Enter a word: ")
shift = input("Enter a number: ")

word = list(word)

indexes = []

def encrypt():
  for letters in word:
    if letters in alphabet:
      index = (alphabet.index(letters))
      int(index)
      indexes.append(index)
  print(indexes)
  n = 0
  n = n + int(shift)
  for i in range(len(indexes)):
   indexes[i] = indexes[i] + n
  print(indexes)
  ceaser_cipher = ''
  for i in indexes:
    if i > len(alphabet)-1:
      i %= len(alphabet)
    ceaser_cipher = ceaser_cipher + (alphabet[i])
  for 
  print(ceaser_cipher)

def decrypt():
  for letters in word:
    index = (alphabet.index(letters))
    int(index)
    indexes.append(index)
  print(indexes)
  n = 0
  n = n + int(shift)
  for i in range(len(indexes)):
   indexes[i] = indexes[i] - n
  print(indexes)
  ceaser_cipher = ''
  for i in indexes:
    if i > len(alphabet)-1:
      i %= len(alphabet)
    ceaser_cipher = ceaser_cipher + (alphabet[i])
  print(ceaser_cipher)  

if en_de == "encrypt":
  encrypt()
elif en_de == "decrypt":
  decrypt()
dz6r00yl

dz6r00yl1#

我想要的结构是这样的:

input_string = input("Enter message or cipher: ")
input_list = input_string.split(" ")
# input_list will be a list of each word in input_string
# encrypt each word in input_list and append each encrypted word 
# to a new list, let's say that list is called output_list
output = " ".join(output_list)
# output will be a string of each item in the list separated by spaces

最终的程序可能看起来像这样:

alphabet = list("abcdefghijklmnopqrstuvwxyz")
message = input("message or cipher: ").lower().split(" ")
shift = int(input("shift: "))
shifted_alphabet = alphabet[shift:] + alphabet[:shift]
cipher_list = []
for word in message:
    cipher_word = ""
    for letter in word:
        cipher_word += shifted_alphabet[alphabet.index(letter)]
    cipher_list.append(cipher_word)
print(" ".join(cipher_list))
mznpcxlj

mznpcxlj2#

你在学习的道路上是正确的,@Toby的回答对你来说是一个很好的贡献。
我想在这里逗你玩,让你知道,一旦你熟悉了许多其他Python特性和语法,整个"Caesar Cipher"可以在一行程序中完全实现。
看看这个

''.join(chr(a + (i - a + shift) % 26) if (a := 65) <= (i := ord(c)) <= 90 or (a := 97) <= i <= 122 else c for c in word)

示例:

cipher = lambda w, s: ''.join(chr(a + (i - a + s) % 26) if (a := 65) <= (i := ord(c)) <= 90 or (a := 97) <= i <= 122 else c for c in w)

word = 'Hello, beautiful World!'
print(cipher(word, 4)) # positive shift
# Lipps, fieyxmjyp Asvph!

word = 'Lipps, fieyxmjyp Asvph!'
print(cipher(word, -4)) # -4 shift means decipher a +4 shift
# Hello, beautiful World!

说明

  • ''.join(seq)接受一个字符串序列seq并将它们连接成一个字符串;
  • ord(c)给出字符c在Unicode表中的索引。例如,ord('a')返回整数97ord('A')返回整数65;
  • chr(i)ord的逆:它给出Unicode表中索引i处的字符。例如,chr(122)返回字符串'z'chr(90)返回字符串'Z';
  • ... for c in wordgenerator expression。是一个很好的简洁高效的习惯用法,用于从另一个序列创建一个序列。在本例中,我取字符串word中的每个字符c,执行一个操作,并使用每个结果元素创建一个新序列。
  • ... if ... else ...是三元运算符。这是在表达式中嵌入条件的快捷方式。这里,如果字符索引不在65到90(大写字母)之间,也不在97到122(小写字母)之间,我将返回相同的字符c。这使得任何非字母都不会被密码转换(如空格、逗号或感叹号);
  • x <= y <= z是一个链式比较,这是Python中一个很好的习惯用法,类似于Math条件表达式。
  • (a := 65)(i := ord(c))使用了walrus运算符:=,也就是“赋值表达式”。这样,你就可以在表达式中使用变量的同时赋值它,并且这个变量将在声明后的封闭上下文中使用。例如,ior运算符的左侧赋值,并在右侧使用。此外,a在条件的“test”部分中赋值,并在“expression”部分中使用。
  • chr(a + (i - a + shift) % 26)使用python的运算符%执行modulo operation,其中26是从A到Z的字母计数。这意味着,如果你的shift让你的字母溢出了字母表,它会循环回到开头/结尾。例如,'B'-4的位移产生'X',而'x'+30的位移产生'b'(因为30 = 26 + 4);

这是一个相当人为的实现,但希望你今天能了解一些关于python的新东西!

相关问题