2016-04-06 14 views
1

Caesar şifresi yapıyorum ve kodu çalıştırdığımda indeks hatası alıyorum. Birkaç harf olduğunda mesajı çalışır ve şifreler, ancak ondan fazla kelime girdiğimde bana bir dizin hatası verir.IndexError: Sezginin şifrelenmesi için liste dışı aralık listesi

shift_key = int(raw_input("Enter in your key shift: 1-9\n>>> ")) 

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'] 
encrypted_alphabet = [] 
encrypted_message = '' 

for i in alphabet[shift_key:]: 
    encrypted_alphabet.append(i) 

input = raw_input("Enter text to be decoded\n>>> ").upper() 
input = input.split() 

for i in input: 
    for j in i: 
     index = alphabet.index(j) 
     encrypted_message += encrypted_alphabet[index] 
    encrypted_message += ' ' 
print encrypted_message 
+1

Ilgili olmayan ipucu: Eğer 'string 'diyorsanız, uzun' alfabe' listenizi 'string.ascii_uppercase' ile değiştirebilirsin –

+1

İpucu ipucu ... module kullan :) Bu" etrafında sarın "yapar ve dizide sıfır. Tek karakter örneği: 'encrypted_char = alfabe [(alphabet.index (plain_char) + shift_value)% len (alfabe)]'. Alfabe 'alfabe = [x (x) için x (ch) (x) (65,91)]' – jDo

+0

olabilir. Bir alfabe yaratmanın ek yöntemlerini açıkladığınız için teşekkürler. Her ikisi de iyi çalışıyor. – avbirm

cevap

2

sorun bu iki çizgi içinde: alphabet[shift_key:]dilimleri listesini alphabet yapıyor sadece shift_key başlayarak bu öğeleri almak

for i in alphabet[shift_key:]: 
    encrypted_alphabet.append(i) 

Bildirim söyledi. Başka bir deyişle, shift_key, örneğin 25 ise, alphabet[shift_key:] yalnızca ['Y','Z'] döndürür. Bunları encrypted_alphabet, encrypted_alphabet'a eklediğinizden, sadece ['Y','Z'] olur. Ama istediğinizi de encrypted_alphabet sonuna eklenen alfabenin dinlenme dinlenme olduğunu.

encrypted_alphabet ve alphabet eşleşmiyor.

bunu yapmak sağ yolu bilmek istiyorsanız Bununla birlikte, çok basit bir şekilde (hatta daha basitçe)

for i in alphabet[shift_key:] + alphabet[:shift_key]: 
    encrypted_alphabet.append(i) 

veya

encrypted_alphabet = alphabet[shift_key:] + alphabet[:shift_key] 

bunu düzeltebilirsiniz Bunun yerine, maketrans dahili dizge yöntemini kullanın, bu da daha basittir:

Kod görüldüğü gibi
import string 

shift_key = int(raw_input("Enter in your key shift: 1-9\n>>> ")) 

alphabet = string.ascii_uppercase 
encrypted_alphabet = alphabet[shift_key:] + alphabet[:shift_key] 
caesar = string.maketrans(alphabet,encrypted_alphabet) 
input = raw_input("Enter text to be decoded\n>>> ").upper() 

print(input.translate(caesar)) 

Hızlı açıklama

, maketrans diğer ilk de her karakter eşleme, bir çeviri tablo iki arasındaki dizeleri oluşturur. Bu çeviri tablosunu, her dizenin sahip olduğu .translate() yöntemine besleyebilirsiniz.

+2

'maktrans' ->' maketrans' Bunu yapmanın iyi yolu btw. – jDo

+0

@jDo Teşekkürler, sabitleniyor :) –

+0

Detaylı yanıt için teşekkür ederiz. Maketrans'ın gerçekte ne yaptığı konusunda ELI5'i arayabilir misiniz? – avbirm

İlgili konular