短rot13函数 - Python

sve*_*ltr 59 python string encoding

我在Python中搜索一个简短而酷的rot13函数;-)我写了这个函数:

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 ) 
Run Code Online (Sandbox Code Playgroud)

谁能让它变得更好?例如,支持大写字符.

Naz*_*san 131

这很简单:

>>> import codecs
>>> codecs.encode('foobar', 'rot_13')
'sbbone'
Run Code Online (Sandbox Code Playgroud)

  • 别人注意:你必须使用''rot_13'而不是''rot13'来使它在Python 3中运行. (15认同)
  • @Reshure:+1:'rot_13'适用于Python 2.4-2.7,3.2 + (6认同)
  • 这似乎是新的_proper_方式.他们将其移出字符串对象以实现模块化.现在,字符串对象`str.encode()`引发了关于不返回字节数组或字节对象的错误. (5认同)
  • 我已经在我的Python`2.7.6`和`3.4.1`的安装上进行了测试,并且_appears_可以使用`rot13`或`rot_13`。请参阅[此处](https://cdn.mediacru.sh/AzWNOcS6JJvr.png)。 (2认同)

Pau*_*bel 76

这是一个maketrans/translate解决方案

import string
rot13 = string.maketrans( 
    "ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz", 
    "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
string.translate("Hello World!", rot13)
# 'Uryyb Jbeyq!'
Run Code Online (Sandbox Code Playgroud)

  • 这不再适用于Python3.2 +; `maketrans`已从`string`模块中删除.请改用Nazmul Hasan的`codecs`答案. (12认同)
  • 对于Python3.x:改为````rot13 = str.maketrans(...)```然后````Hello World!".translate(rot13)``` (5认同)
  • 这是最短的,可在3.0下使用:-) (3认同)

Amb*_*ber 65

这适用于Python 2(但不适用于Python 3):

>>> 'foobar'.encode('rot13')
'sbbone'
Run Code Online (Sandbox Code Playgroud)

  • @poke:它绝对是 Python 3 中可用的编解码器。只是不是作为 str-to-bytes 或 bytes-to-str 编解码器。 (2认同)

ars*_*ars 21

maketranstranslate中的功能string模块时很方便,这种类型的东西.当然,encodeAmber的响应中的方法对于这种特定情况更为方便.

这是一般解决方案:

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'
Run Code Online (Sandbox Code Playgroud)


Art*_*par 10

来自模块this.py(import this).

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])
Run Code Online (Sandbox Code Playgroud)

  • 您也可以直接导入。`import this; rot13 = lambda s:''。join(this中的c中的this.d.get(c,c))。只是说。 (2认同)

bbc*_*bbc 8

对于Python 3.1,string.translatestring.maketrans不再存在.但是,这些方法可以bytes代替使用.

因此,最新的解决方案直接受到Paul Rubel的启发,是:

rot13 = bytes.maketrans(
    b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
    b"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM")
b'Hello world!'.translate(rot13)
Run Code Online (Sandbox Code Playgroud)

从转换stringbytes,反之亦然可以用做encodedecode内置函数.


Bar*_*est 6

试试这个:

import codecs
codecs.encode("text to be rot13()'ed", "rot_13")
Run Code Online (Sandbox Code Playgroud)


ank*_*tis 5

在python-3中,str@ amber提到的-codec已移至codecs标准库:

> import codecs
> codecs.encode('foo', 'rot13')
sbb
Run Code Online (Sandbox Code Playgroud)

  • @StevenRumbalski:如果 `str.encode('rot13')` 曾经在较旧的 3.x 版本中工作过,那么这是一个错误,因为 `str.encode()` 对于生成 `bytes` 结果是严格的 *仅*,而 ROT13是一个文本到文本的编解码器。 (2认同)