2016-09-29 132 views
1
def main(): 

    cc = (input("Enter Message to Encrypt\n"))#user input 

    shift = int(2) #shift length 

    a=["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"] #reference list 

    newa={} #new shifted reference list 

    for i in range (0,len(a)): 
     newa [a[i]]=a[(i+shift)%len(a)] 
     #adds shifted 2 alaphabet into newalaphabet 
     #% moodulus used to wrap 

     for i in cc: #iterates through cc 
      if i in a: 
        a[i]=cc[i] 
        a[i]=newa[i] 

main() 

所以我需要从用户#cc凯撒密码移由两个字母

转移需要有两个

我用了一个字母列表

然后由两个字母移位输入创建新的

但我不知道如何将新字母表应用于我的用户输入

+0

可提供样品的输入和输出? –

回答

0

迭代通过串cc和使用的newaget方法代替所有的字母。字符是不是在字典中保留原样,通过将其作为默认newa.get当钥匙丢失:

newa = {} 
for i, x in enumerate(a): 
    newa[x] = a[(i+shift) % len(a)] 

encrypted_text = ''.join(newa.get(i, i) for i in cc) 

Python的内置enumerate可以代替range(len(a))在这种情况下,你需要使用在a项目和它们各自的指数。

+0

为什么你需要new.get中的(i,i)? – fsauceg

+0

这是从字典中获取*值的替代方式,当找不到密钥时不会引发'KeyError'。阅读[了解Python中的.get()'方法](http://stackoverflow.com/questions/2068349/understanding-get-method-in-python) –

0

使用映射每一个字符,然后再加入他们回到创建加密的消息:

''.join(map(lambda x: chr((ord(x) - 97 + shift) % 26 + 97) if x in alphabet else x, cc.lower())) 

整合会这样:对于字母是所有相同的情况下

import string 
alphabet = string.ascii_lowercase 
cc = input('Enter string to encode: ') 
shift = 2 # could be any number 

encrypted = ''.join(map(lambda x: chr((ord(x) - 97 + shift) % 26 + 97) if x in alphabet else x, cc.lower())) 

cc.lower()(以使用常数的地图ord

chr((ord(x) - 97 + shift) % 26 + 97)

  • 得到数减去97(0代表a,1 b等)的值。
  • 应用移位(a转向c等)。
  • 调制由26,以防止像z信件超过(25 + 2 = 27,27%26 = 1 = b)。
  • 加97带信回ASCII标准(97 a,98 b等)

if x in alphabet else x盖的迹象,如果你想忽略空格和标点符号使用if x in alphabet else ''不在信(代替)。

0

使用字典来映射输入输出

shifted_a = a[-shift:] + a[:-shift] 
cipher = {a[i]: shifted_a[i] for i in range(len(a))} 
output = ''.join(cipher[char] for char in cc) 
0

我只是建立转换表,并用它来解码字符串。

import string 
shift = 2 
letters = string.ascii_lowercase + string.ascii_uppercase 
transtable = str.maketrans({letters[i]: letters[(i + shift) % len(letters)] 
          for i in range(len(letters))}) 

cc = input('Enter string to encode: ') 
print(cc.translate(transtable)) 
0

我会把我的解决方案放在那里。它应该很清楚它是如何工作的...

import string 

index_lookup = {letter: index for index, letter in enumerate(string.ascii_lowercase)} 

def caesar_letter(l, shift=2): 
    new_index = index_lookup[l] + shift 
    return string.ascii_lowercase[new_index % len(index_lookup)] 

def caesar_word(s): 
    return ''.join([caesar_letter(letter) for letter in s]) 

我认为上面的可读性更好,但如果您反对导入...

index_lookup = {chr(idx): idx - ord('a') for idx in range(ord('a'), ord('z')+1)} 

...

In [5]: caesar_word('abcdefghijklmnopqrstuvwxyz') 
Out[5]: 'cdefghijklmnopqrstuvwxyzab'