想建立如下映射关系:
'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点的方法呢?
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'}
需求是實現了,我覺得你可能問題關鍵不是我所回答的。
ringa_lee2017-04-17 13:05:37
dict(zip(al, map(lambda x : chr((ord(x) - 95) % 26 + 97), al)) )
坐等高手...
迷茫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']
呵呵, 沒有檢驗部分
巴扎黑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 :(