[英]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()
两件事情:
match
,只需循环zip
x
和y
,而不必使用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.