from string import maketrans
table = maketrans('abcdefghijklmnopqrstuvwxyz/','zabcdefghijklmnopqrstuvwxy ')
for x in ('pdfbo','qipophsbqi','cmvf/nppo/jo/b/sfe/tlz'):
print x,' -> ',x.translate(table)
结果
pdfbo -> ocean
qipophsbqi -> phonograph
cmvf/nppo/jo/b/sfe/tlz -> blue moon in a red sky
编辑
我重新编写了Joachim的算法(函数better()),并且我自己写了一个不使用maketrans()的解决方案(yop()):
s = '{ifmmp}\t\tcmvf-nppo \n SUNNY ~ ajhabh 14568'
def bof(s):
new_s = ''
for c in s:
n = ord(c)
n = n - 1
if n < ord('a'):
n = ord('z')
new_s += chr(n)
return new_s
def better(s):
li = []
for c in s:
n = ord(c)-1
if n == 96:
li.append('z')
elif 96<n<122:
li.append(chr(n))
else:
li.append(c)
return ''.join(li)
def yop(s):
gen = ((c,ord(c)-1) for c in s)
return ''.join('z' if y==96 else chr(y) if 96<y<122 else x for x,y in gen)
def better_yop(s):
def gen(h):
for c in h:
n = ord(c)-1
if n == 96:
yield 'z'
elif 96<n<122:
yield chr(n)
else:
yield c
return ''.join(gen(s))
for truc in (s,bof(s),better(s),yop(s),better_yop(s)):
print '%r\n%s\n' % (truc,truc)
结果
'{ifmmp}\t\tcmvf-nppo \n SUNNY ~ ajhabh 14568'
{ifmmp} cmvf-nppo
SUNNY ~ ajhabh 14568
'zhello|zzbluezmoonzzzzzzzzz}zzigzagzzzzzz'
zhello|zzbluezmoonzzzzzzzzz}zzigzagzzzzzz
'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello} blue-moon
SUNNY ~ zigzag 14568
'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello} blue-moon
SUNNY ~ zigzag 14568
'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello} blue-moon
SUNNY ~ zigzag 14568
然而,我的函数yop()比函数better()慢一些。
.
编辑
现在函数better_yop()的速度等同于函数better()的速度。
然而,better()似乎比better_yop()稍微快一些。由于它也更简单,better()是最好的选择。
for
循环、chr()
和ord()
已经有文档。请记住,字符串是不可变的,所以您不能只是将一个字符串更改为另一个字符串,而是必须创建一个新的完全包含新值的字符串。此外,除非这是关于如何执行简单的for
循环的作业,否则您可能想完全忘记循环,而直接调用string.translate()
。 - Duncan