python2.7 maketrans工作原理

今天用到了python str maketrans,顺道看了一下实现原理,做一下记录

# Case conversion helpers
# Use str to convert Unicode literal in case of -U
# 把ascii表的字符放到list中
l = map(chr, xrange(256))
# 把list转换为str
_idmap = str('').join(l)
del l
# Construct a translation string

...

_idmapL = None
def maketrans(fromstr, tostr):
    """maketrans(frm, to) -> string

    Return a translation table (a string of 256 bytes long)
    suitable for use in string.translate.  The strings frm and to
    must be of the same length.

    """
    # 保证fromstr和tostr长度一致,不然下面替换的代码就会报错
    if len(fromstr) != len(tostr):
        raise ValueError, "maketrans arguments must have same length"
    global _idmapL
    # 再把ascii的字符串转换为list
    if not _idmapL:
        _idmapL = list(_idmap)
    # 列表切片产生的是列表的副本,与原列表不是同一份空间,对L的操作不会影响到_idmapL
    L = _idmapL[:]
    # 把fromstr每一个需要替换的字符在ascii表中的位置放到fromstr的list中
    fromstr = map(ord, fromstr)
    # 执行具体的替换操作
    for i in range(len(fromstr)):
        L[fromstr[i]] = tostr[i]
    # 返回替换后的ascii表字符串
    return ''.join(L)

大概思路是,把ascii表放到一个list中,然后把list中需要替换的字符,替换为新的字符。所以才会要求fromstr和tostr大小一致,该方法返回的长度固定为256。

这个方法是结合str.translate()一起使用的,maketrans生成一个字符字典,str.translate()方法根据这个字典,替换str中相关的字符,具体的替换操作,另起一篇。

ord函数解释:http://www.runoob.com/python/python-func-ord.html
map函数解释:http://www.runoob.com/python/python-func-map.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值