搜尋

首頁  >  問答  >  主體

如何用Pythonic的方法求一个字符的往后两位字符?

想建立如下映射关系:

'a' -->  'c'   
'b' -->  'd'
    ...
'y' -->  'a'
'z' -->  'b'

在C中我们可以很轻松的用加法实现, 但是换到python, 我想到了以下方法:

from string import ascii_lowercase as al

my_dict = dict(zip(al, [chr((ord(x)-95)%26+97) for x in al]))

看起来一点都不cool, 主要是求字符的后两位字符那里处理的不好, 大伙有没有更pythonic点的方法呢?

PHP中文网PHP中文网2813 天前643

全部回覆(5)我來回復

  • ringa_lee

    ringa_lee2017-04-17 13:05:37

    我不知道為什麼還要用到chr 和ord?? 我的意思是說:你的需求很簡單啊,26個字母是知道的咯,往後錯2位是麼。

    >>> from string import ascii_lowercase as keys
    >>> vals = keys[2:] + keys[:2]
    >>> dict(zip(keys, vals))
    {'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'}
    

    需求是實現了,我覺得你可能問題關鍵不是我所回答的。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:05:37

    雷雷

    Python 挑戰 1 級演練

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:05:37

    dict(zip(al, map(lambda x : chr((ord(x) - 95) % 26 + 97), al)) )

    坐等高手...

    回覆
    0
  • 迷茫

    迷茫2017-04-17 13:05:37

    a = 'abcdefghijklmnopqrstuvwxyz'
    b = [chr(((ord(x) - 95) % 26) + 97) for x in 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', 'a', 'b']
    

    呵呵, 沒有檢驗部分

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:05:37

    from string import ascii_lowercase
    from itertools import cycle
    from itertools import islice
    from itertools import izip
    
    N = 2
    
    dict(izip(ascii_lowercase,
              islice(cycle(ascii_lowercase),
                     N,
                     None)))
    

    其實一點也不 Pythonic :(

    回覆
    0
  • 取消回覆