繁体   English   中英

用Python简化Vigenere密码程序

[英]Simplifying Vigenere cipher program in Python

我在下面有程序,该程序被传递到另一个函数,该函数仅打印出原始和加密的消息。 我想知道如何简化该程序,特别是“ match = zip”和“ change =(reduce(lambda)行。如果可能的话,不使用lambda,我该怎么办?

from itertools import cycle

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

def vigenereencrypt(message,keyword):
    output = ""    
    match = zip(message.lower(),cycle(keyword.lower()))
    for i in match:
        change = (reduce(lambda x, y: alphabet.index(x) + alphabet.index(y), i)) % 26
        output = output + alphabet[change]
    return output.lower()

两件事情:

  1. 您不需要本地变量match ,只需循环zip
  2. 您可以在for循环定义中拆分两个索引xy ,而不必使用reduce reduce通常用于较大的可迭代对象,由于i只有2个项目,因此增加了不必要的复杂性。

即,您可以将for循环定义更改为:

for x, y in zip(...):

以及您对以下内容的change定义:

change = (alphabet.index(x) + alphabet.index(y)) % 26

从纳尔所说的开始:

def vigenereencrypt(message,keyword):
    output = ""
    for x, y in zip(message.lower(), cycle(keyword.lower())):
        change = (alphabet.index(x) + alphabet.index(y)) % 26
        output = output + alphabet[change]
    return output.lower()

通过使用列表然后将其连接,而不是添加到字符串,并且还注意到输出已经是小写字母,我们可以提高效率:

def vigenereencrypt(message,keyword):
    output = []
    for x, y in zip(message.lower(), cycle(keyword.lower())):
        change = (alphabet.index(x) + alphabet.index(y)) % 26
        output.append(alphabet[change])
    return "".join(output)

然后,我们可以将循环的主体减少到一行。

def vigenereencrypt(message,keyword):
    output = []
    for x, y in zip(message.lower(), cycle(keyword.lower())):
        output.append(alphabet[(alphabet.index(x) + alphabet.index(y)) % 26])
    return "".join(output)

...因此我们可以将其转化为列表理解:

def vigenereencrypt(message,keyword):
    output = (
        alphabet[(alphabet.index(x) + alphabet.index(y)) % 26]
        for x, y in zip(message.lower(), cycle(keyword.lower()))
    )
    return "".join(output)

我觉得我们可以用map(alphabet.index, ...)做些什么,但是我想不出一种比列表理解更好的方法。

你可以用一堆索引而不是zip来做...

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"]
alphaSort = {k:n for n,k in enumerate(alphabet)}
alphaDex = {n:k for n,k in enumerate(alphabet)}

def vigenereencrypt(message,keyword):
    output = ""    
    #match = zip(message.lower(),cycle(keyword.lower()))      # zip(a,cycle(b)) Creates [(a[n],b[n%len(b)]) for k in range(len(a)) ] 
    op = ""                                                  # So lets start with  for k in range(len(a))
    for k in range(len(message)):
        op += alphaDex[(alphaSort[message.lower()[k]]+alphaSort[keyword.lower()[k%len(keyword)]])%len(alphabet)]
    return(op)

暂无
暂无

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

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