您的位置:首页 > 编程语言 > Python开发

python之明密文转换

2014-02-25 23:25 387 查看
这个问题是我在学习Udacity(一个网络课程平台)学习web development课程时遇到的一个问题:

题目大概是定义一个ROT13函数,然后将输入字母转换为相应后移13个位置的字母,比如输入Hello,输出应该是Urryb,大小写不变,别的符号不变。

本能想到用一个对应的二元组的List来进行映射:这里使用的zip,它的功能是将两个列表合并成一个二元组,元组中每个元素是原来列表的元素

L1 = [1,3,5,7]
L2 = [2,4,6,8]
#使用zip将两个列表合并
print zip(L1,L2)
for (a,b) in zip(L1,L2):
print (a,b)
L3 = [2,4,6]
#当长度不一的时候,多余的被忽略
print zip(L1,L3)#extra items are ignored
#map则不会忽略,例如下例。当L1和L3长度不一的时候,
#会用第一个参数来填充。
print map(None,L1,L3)


下面我准备用zip尝试解决这个问题

s = "abcdefghijklmnopqrstuvwxyz"
t = "nopqrstuvwxyzabcdefghijklm"
list = zip(s,t)

def ROT13(str):
for (i,o) in list:
str = str.replace(i,o)
print str
运行模块,结果如下

>>> ROT13("abcdefghijklmnopqrstuvwxyz")

abcdefghijklmabcdefghijklm

也就是说从a到m的没变,从n到z的转换成功

我又举了个其他例子:

>>> ROT13("nopqrstuvwxyzabcdefghijklm")

abcdefghijklmabcdefghijklm

同样只替换n到z
在这儿我感觉到这个replace可能是先找出所有a,替换,然后再找出所有b.....,然后当a~m都替换成n~z后,就和后面的那部分是一样的,接下来字符串中所有的字母都会转换成a~m

想到这儿,我把代码改了一下

将list = zip(s,t)改为 list =zip(t,s)

结果是:

>>> ROT13("abcdefghijklmnopqrstuvwxyz")

nopqrstuvwxyznopqrstuvwxyz

只替换a~m了,上述假设貌似有点道理

为了进一步验证我的想法,我又把代码改了一下s = "abc"
t = "bca"
list = zip(s,t)

def ROT13(str):
for (i,o) in list:
str = str.replace(i,o)
print str

这样,如果上述猜想是正确地,那么ROT13("abca")之后应该是aaa
具体转化过程是abc->bbc->ccc->aaa
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: