2017-04-14 51 views
0

例如,我有一個lst = "ABCXYZ",我希望可以將輸出爲"CDEZAB"如何用Pythonic的方式將「ABCD ...」轉換爲「CDEF ...」?

我想出到目前爲止是最好的方法:

"".join(chr((ord(x)-ord('A')+2)%26+ord('A')) for x in lst) 

這是尷尬。使用像{'A': 'C', 'B': 'D', ……, 'X': 'Z', 'Y': 'A', 'Z': 'B'}這樣的字典似乎更加Pythonic,但更加尷尬。

任何想法?

+1

字典可以創建非常容易,但:'CONV =字典(拉鍊(字母,字母[2:] +字母[:2]))''作爲 ''。加入然後轉換是一樣簡單( map(conv.get,string))' – BlackBear

+0

[凱撒密碼函數在Python]可能重複(http://stackoverflow.com/questions/8886947/caesar-cipher-function-in-python) –

回答

6

你可以簡單的構建詞典:

>>> import string 
>>> dict(zip(string.uppercase, string.uppercase[2:]+string.uppercase[:2])) 
{'A': 'C', 'C': 'E', 'B': 'D', 'E': 'G', 'D': 'F', 'G': 'I', 'F': 'H', 'I': 'K', 'H': 'J', 'K': 'M', 'J': 'L', 'M': 'O', 'L': 'N', 'O': 'Q', 'N': 'P', 'Q': 'S', 'P': 'R', 'S': 'U', 'R': 'T', 'U': 'W', 'T': 'V', 'W': 'Y', 'V': 'X', 'Y': 'A', 'X': 'Z', 'Z': 'B'} 

,然後使用它:

>>> m = dict(zip(string.uppercase, string.uppercase[2:]+string.uppercase[:2])) 
>>> ''.join(map(m.get, "ABCXYZ")) 
'CDEZAB' 
2

什麼你的建議對我來說很有意義;它可以稍微更優雅一些內置插件。

import string 

s = "ABCXYZ" 

d = dict(enumerate(string.ascii_uppercase)) 
''.join([d[(string.ascii_uppercase.index(c) + 2)%26] for c in s]) 
相關問題