Я ищу короткую и прохладную функцию rot13 в Python ;-) Я записал эту функцию:
def rot13(s):
chars = "abcdefghijklmnopqrstuvwxyz"
trans = chars[13:]+chars[:13]
rot_char = lambda c: trans[chars.find(c)] if chars.find(c)>-1 else c
return ''.join( rot_char(c) for c in s )
Кто-либо может сделать его лучше? Например, поддержка символов верхнего регистра.
Вот решение maketrans / translate
import string
rot13 = string.maketrans(
"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",
"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
string.translate("Hello World!", rot13)
# 'Uryyb Jbeyq!'
Попробуйте следующее:
import codecs
codecs.encode("text to be rot13()'ed", "rot_13")
Функции maketrans
и translate
в модуле string
удобны для такого рода вещей. Конечно, метод encode
в ответе Эмбер еще удобнее для этого конкретного случая.
Вот общее решение:
import string
def make_rot_n(n):
lc = string.ascii_lowercase
uc = string.ascii_uppercase
trans = string.maketrans(lc + uc,
lc[n:] + lc[:n] + uc[n:] + uc[:n])
return lambda s: string.translate(s, trans)
rot13 = make_rot_n(13)
rot13('foobar')
# 'sbbone'
Это работает на Python 2 (но не на Python 3):
>>> 'foobar'.encode('rot13')
'sbbone'
Это очень просто:
>>> import codecs
>>> codecs.encode('foobar', 'rot_13')
'sbbone'
Из модуля this.py
( импортируйте этот
).
d = {}
for c in (65, 97):
for i in range(26):
d[chr(i+c)] = chr((i+13) % 26 + c)
print "".join([d.get(c, c) for c in s])