2016-05-12 3 views
0

私は以下のプログラムを持っています。これは元のメッセージと暗号化されたメッセージを単に出力する別の関数に渡されます。私はどのようにI?PythonでのVigenere暗号プログラムの簡素化

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() 

答えて

2

二つのことができ、「=変更((ラムダ減らす」特異的に「一致=ジップ」と、私はこのプログラムを簡略化することができる方法を知りたい行を。可能であればラムダを使用せずにこれを行うには物事:あなたはローカル変数match、単にループを持っている必要がいけない

  1. zip
  2. あなたではなくreduceを使用するよりも、あなたの2つの指標あなたのループの定義でxyを分割することができます。通常、大きなために使用されている削減iterablesとsinあなたはiに2つの項目しかありません。それは不必要な複雑さを追加しています。

つまり、あなたがあなたのループの定義を変更することができます:あなたの代わりに郵便番号のインデックスの束でそれを行うことができ

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

素晴らしい。私はそれを3未満です。 – kpie

0

:に

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

changeのあなたの定義...

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) 
1

Rナールは言った:

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) 

その後、我々は... .. 1行に

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, ...)でできることがあるように感じますが、リストの理解よりも優れているとは思いません。