一个字符映射问题的实现方法

问题描述:

    最近在网上看到一个有意思的问题,就是建立一个映射规则,比如说a-->c, x-->z, z-->b。也就是说,相当于将字母表中间所有字母映射到循环移位后两位的字母。通过这样的方式,将一个字符串解码。假设有这么一个字符串:“lmu ynnjw ml rfc spj”。如果我们要对它按照前面循环后移位两位的方式解码的话,解码的结果将是:“now apply on the url”.

 

问题分析:

    这个问题总的来说,可以分为两个部分,一个是对单个字符进行解码,另外一个是遍历整个字符串,返回结果。先看看解码部分:

 

 

def decode(a):
     if a >= 'a' and a <= 'z':
            result = chr(ord(a) + 2) if ord(a) + 2 < ord('z') else chr(ord(a) - 24)
             return result
     else:
             return a

 

1. 从前面的结果我们可以看到,首先需要判断,只对字母表中间的字符进行转换,所以需要一个判断条件。

2. 我们用到了两个方法,一个ord(),该方法主要是返回一个字符所对应的ASCII码数字值,而chr()则返回一个数字所对应的字符,一般是0-255之间。

3. 因为要循环移位解码,所以需要对+2之后的字符判断,如果超过了字符'z'的编码,则要绕到字母列表开头。

 

完成了第一步之后,下一步则是返回一个可以遍历访问的结果集,考虑到实际应用中的情况,如果要解码的字符串非常的长,我们可以考虑返回一个generator。按照这种办法,则返回遍历结果的代码如下:

 

def result_iter(a):
     for item in a:
             yield translate(item)

 

 这样,如果我们后续要使用这个方法的话,就比较省事了,可以用如下的语句:

 

for item in result_iter(a):
    print item,

 

这里假设 a是传入的需要解码的字符串a='“lmu ynnjw ml rfc spj'。则返回的结果就如下:

 

n o w   a p p l y   o n   t h e   u r l

 

 总结:

这是由一个问题想到的最初的解决办法,因为要用到一些典型python式的代码方法,其中就用到了条件表达式和generator。这些可以很大程度上精简代码。不过这只是针对特定情况的一个办法,没有考虑到偏移任意位以及对大写字母的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值