字符串-短rot13函数-Python

我正在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 )

谁能做得更好? 例如,支持大写字符。

20个解决方案

120 votes

很简单:

>>> import codecs

>>> codecs.encode('foobar', 'rot_13')

'sbbone'

Nazmul Hasan answered 2019-10-13T16:14:14Z

70 votes

这是一个maketrans / translate解决方案

import string

rot13 = string.maketrans(

"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",

"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")

string.translate("Hello World!", rot13)

# 'Uryyb Jbeyq!'

Paul Rubel answered 2019-10-13T16:13:49Z

63 votes

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

>>> 'foobar'.encode('rot13')

'sbbone'

Amber answered 2019-10-13T16:14:39Z

21 votes

string模块中的string和string功能对于此类事情非常有用。 当然,对于这种特定情况,Amber响应中的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'

ars answered 2019-10-13T16:15:16Z

10 votes

来自模块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])

Artur Gaspar answered 2019-10-13T16:15:42Z

8 votes

从Python 3.1开始,不再存在decode和bytes。 但是,这些方法可以代替bytes使用。

因此,直接从Paul Rubel的想法中得到启发的最新解决方案是:

rot13 = bytes.maketrans(

b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",

b"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM")

b'Hello world!'.translate(rot13)

可以使用decode和decode内置函数来完成从decode到bytes的转换,反之亦然。

bbc answered 2019-10-13T16:16:22Z

6 votes

试试这个:

import codecs

codecs.encode("text to be rot13()'ed", "rot_13")

Barrest answered 2019-10-13T16:16:43Z

5 votes

在python-3中,@ amber提到的str-codec已移至codecs standard-library:

> import codecs

> codecs.encode('foo', 'rot13')

sbb

ankostis answered 2019-10-13T16:17:13Z

3 votes

单线腐烂一串S:

S.translate({a : a + (lambda x: 1 if x>=0 else -1)(77 - a) * 13 for a in range(65, 91)})

wjv answered 2019-10-13T16:17:42Z

2 votes

对于任意值,类似的东西适用于2.x

from string import ascii_uppercase as uc, ascii_lowercase as lc, maketrans

rotate = 13 # ROT13

rot = "".join([(x[:rotate][::-1] + x[rotate:][::-1])[::-1] for x in (uc,lc)])

def rot_func(text, encode=True):

ascii = uc + lc

src, trg = (ascii, rot) if encode else (rot, ascii)

trans = maketrans(src, trg)

return text.translate(trans)

text = "Text to ROT{}".format(rotate)

encode = rot_func(text)

decode = rot_func(encode, False)

user1543747 answered 2019-10-13T16:18:09Z

2 votes

这适用于大写和小写。 我不知道你认为这有多优雅。

def rot13(s):

rot=lambda x:chr(ord(x)+13) if chr(ord(x.lower())+13).isalpha()==True else chr(ord(x)-13)

s=[rot(i) for i in filter(lambda x:x!=',',map(str,s))]

return ''.join(s)

Eratosthenes answered 2019-10-13T16:18:37Z

2 votes

您可以通过交替使用大写字母和小写字母来支持Walter先生张贴的原始代码中的大写字母。

chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"

如果您注意到大写字母的索引全为偶数,而小写字母的索引为奇数。

A = 0 a = 1

B = 2,b = 3,

C = 4,c = 4,

...

这种奇偶模式使我们可以安全地添加所需的数量,而不必担心这种情况。

trans = chars[26:] + chars[:26]

添加26的原因是由于大写字母,字符串中的字母已加倍。 但是,移位仍然是字母上的13个空格。

完整代码:

def rot13(s):

chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"

trans = chars[26:]+chars[:26]

rot_char = lambda c: trans[chars.find(c)] if chars.find(c) > -1 else c

return ''.join(rot_char(c) for c in s)

输出(使用python 2.7测试):

print rot13("Hello World!") --> Uryyb Jbeyq!

Diaz answered 2019-10-13T16:20:04Z

2 votes

以下函数rot(s, n)使用对所有整数n进行编码的ROT-2567684473345345278978编码字符串s,其中n缺省为13。同时支持大小写字母。 适当处理n超过26的值或负值,例如,移位27个位置等于移位一个位置。 解码是通过invrot(s, n)完成的。

import string

def rot(s, n=13):

'''Encode string s with ROT-n, i.e., by shifting all letters n positions.

When n is not supplied, ROT-13 encoding is assumed.

'''

upper = string.ascii_uppercase

lower = string.ascii_lowercase

upper_start = ord(upper[0])

lower_start = ord(lower[0])

out = ''

for letter in s:

if letter in upper:

out += chr(upper_start + (ord(letter) - upper_start + n) % 26)

elif letter in lower:

out += chr(lower_start + (ord(letter) - lower_start + n) % 26)

else:

out += letter

return(out)

def invrot(s, n=13):

'''Decode a string s encoded with ROT-n-encoding

When n is not supplied, ROT-13 is assumed.

'''

return(rot(s, -n))

jeroen answered 2019-10-13T16:20:37Z

1 votes

def rot13(s):

lower_chars = ''.join(chr(c) for c in range (97,123)) #ASCII a-z

upper_chars = ''.join(chr(c) for c in range (65,91)) #ASCII A-Z

lower_encode = lower_chars[13:] + lower_chars[:13] #shift 13 bytes

upper_encode = upper_chars[13:] + upper_chars[:13] #shift 13 bytes

output = "" #outputstring

for c in s:

if c in lower_chars:

output = output + lower_encode[lower_chars.find(c)]

elif c in upper_chars:

output = output + upper_encode[upper_chars.find(c)]

else:

output = output + c

return output

转移的另一种解决方案。 也许这段代码可以帮助其他人更好地理解rot13。还没有完全测试。

DeaD_EyE answered 2019-10-13T16:21:08Z

0 votes

from string import maketrans, lowercase, uppercase

def rot13(message):

lower = maketrans(lowercase, lowercase[13:] + lowercase[:13])

upper = maketrans(uppercase, uppercase[13:] + uppercase[:13])

return message.translate(lower).translate(upper)

user847988 answered 2019-10-13T16:21:31Z

0 votes

有趣的练习;-)我认为我有最好的解决方案,因为:

无需模块,仅使用内置功能->无需弃用

它可以用作一个衬里

基于ascii,没有映射字典/字符串等。

Python 2和3(可能是Python 1):

def rot13(s):

return ''.join([chr(ord(n) + (13 if 'Z' < n < 'n' or n < 'N' else -13)) if n.isalpha() else n for n in s])

def rot13_verbose(s):

x = []

for n in s:

if n.isalpha():

# 'n' is the 14th character in the alphabet so if a character is bigger we can subtract 13 to get rot13

ort = 13 if 'Z' < n < 'n' or n < 'N' else -13

x.append(chr(ord(n) + ort))

else:

x.append(n)

return ''.join(x)

# crazy .min version (99 characters) disclaimer: not pep8 compatible^

def r(s):return''.join([chr(ord(n)+(13if'Z'n else-13))if n.isalpha()else n for n in s])

yamm answered 2019-10-13T16:22:34Z

0 votes

当我开始思考实现最简单的方法时,我找到了这篇文章rot13自己放入Python。 我的目标是:

在Python 2.7.6和3.3中均可使用。

处理大写和小写。

不使用任何外部库。

这满足了所有这三个要求。 话虽如此,我敢肯定它没有赢得任何代码高尔夫比赛。

def rot13(string):

CLEAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

ROT13 = 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'

TABLE = {x: y for x, y in zip(CLEAR, ROT13)}

return ''.join(map(lambda x: TABLE.get(x, x), string))

if __name__ == '__main__':

CLEAR = 'Hello, World!'

R13 = 'Uryyb, Jbeyq!'

r13 = rot13(CLEAR)

assert r13 == R13

clear = rot13(r13)

assert clear == CLEAR

这可以通过创建查找表并为查找表中未找到的任何字符简单地返回原始字符来实现。

更新

我不得不担心有人想要使用它来加密任意大的文件(例如几GB的文本)。 我不知道他们为什么要这样做,但是如果他们这样做呢? 因此,我将其重写为发电机。 同样,这已经在Python 2.7.6和3.3中进行了测试。

def rot13(clear):

CLEAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

ROT13 = 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'

TABLE = {x: y for x, y in zip(CLEAR, ROT13)}

for c in clear:

yield TABLE.get(c, c)

if __name__ == '__main__':

CLEAR = 'Hello, World!'

R13 = 'Uryyb, Jbeyq!'

r13 = ''.join(rot13(CLEAR))

assert r13 == R13

clear = ''.join(rot13(r13))

assert clear == CLEAR

Doug R. answered 2019-10-13T16:23:54Z

0 votes

我不能在这里没有使用模运算符的单个语句来留下这个问题。

def rot13(s):

return ''.join([chr(x.islower() and ((ord(x) - 84) % 26) + 97

or x.isupper() and ((ord(x) - 52) % 26) + 65

or ord(x))

for x in s])

这不是pythonic也不是很好的做法,但是可以!

>> rot13("Hello World!")

Uryyb Jbeyq!

Zv_oDD answered 2019-10-13T16:24:36Z

0 votes

您也可以使用它

def n3bu1A(n):

o=""

key = {

'a':'n', 'b':'o', 'c':'p', 'd':'q', 'e':'r', 'f':'s', 'g':'t', 'h':'u',

'i':'v', 'j':'w', 'k':'x', 'l':'y', 'm':'z', 'n':'a', 'o':'b', 'p':'c',

'q':'d', 'r':'e', 's':'f', 't':'g', 'u':'h', 'v':'i', 'w':'j', 'x':'k',

'y':'l', 'z':'m', 'A':'N', 'B':'O', 'C':'P', 'D':'Q', 'E':'R', 'F':'S',

'G':'T', 'H':'U', 'I':'V', 'J':'W', 'K':'X', 'L':'Y', 'M':'Z', 'N':'A',

'O':'B', 'P':'C', 'Q':'D', 'R':'E', 'S':'F', 'T':'G', 'U':'H', 'V':'I',

'W':'J', 'X':'K', 'Y':'L', 'Z':'M'}

for x in n:

v = x in key.keys()

if v == True:

o += (key[x])

else:

o += x

return o

Yes = n3bu1A("N zhpu fvzcyre jnl gb fnl Guvf vf zl Zragbe!!")

print(Yes)

Francis Bangura answered 2019-10-13T16:25:08Z

-2 votes

简短的解决方案:

def rot13(text):

return "".join([x if ord(x) not in range(65, 91)+range(97, 123) else

chr(((ord(x)-97+13)%26)+97) if x.islower() else

chr(((ord(x)-65+13)%26)+65) for x in text])

SyntaxError answered 2019-10-13T16:25:40Z

python uppercase函数_字符串-短rot13函数-Python相关推荐

  1. python命名规则数字开头的成语_浅谈Python中带_的变量或函数命名

    搜索热词 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就 ...

  2. Python语言学习之字符串那些事:python和字符串的使用方法之详细攻略

    Python语言学习之字符串那些事:python和字符串的使用方法之详细攻略 目录 python与字符串的那些事 1.字符串中只保留汉字 2.字符串的截取 3.在字符串中加入变量 4.字符串与列表转换 ...

  3. python中float函数作用_解析要在Python中浮动的字符串(float()函数)

    给定一个字符串值(包含浮点值),我们必须在Python中将其转换为浮点值. 要将字符串值转换为float,我们使用float()功能. Python float() 功能 float()functio ...

  4. 来自python的【str字符串内置函数】

    字符串内置函数–capitalize 遇见非字符串后,下一个字符大写 str.capitalize():将字符串转换成大写,其他字母变成小写 capitalize 含义 capitalize(...) ...

  5. python 不定参数_人生苦短,我学不会Python。——函数中不定长参数的写法

    定义函数 我们可以定义一个实现自己想要的功能的函数.Python定义函数以def开头,定义函数基本格式如下: def 函数名 (参数列表):"函数_文档字符串"函数体 return ...

  6. Python 循环语句和字符串内置函数

    系列文章目录 第五章 Python 机器学习入门之循环语句与字符串内置函数 Python 机器学习入门之循环语句 系列文章目录 前言 一.while 二.while嵌套循环 三.掷骰子 四.break ...

  7. python islower函数_python字符串是否是小写-python 字符串小写-python islower函数-python islower函数未定义-嗨客网...

    Python字符串是否是小写教程 在开发过程中,有时候我们需要判断一个 Python islower()函数详解 语法 str.islower() -> bool 参数 参数 描述 str 表示 ...

  8. python fact函数_第5天:Python 函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,所以我经常说函数是程序员规模化使用的基础. 函数能提高应用的模块性,和代码的重复利用率.在程序设计中,常将一些常用的功能模块编写成函数 ...

  9. 封装成vla函数_第四章:Python之函数

    第一节:函数入门与定义函数 理解函数 所谓函数,就是为一段实现特定功能的代码"取"个名字,以后即可通过该名字来执行(调用)这段代码 从逻辑上看,函数相当于一个黑匣子 定义函数的语法 ...

最新文章

  1. AI超算“攒机”时代到来:为降低算力成本,这家公司牵头开放硬件标准
  2. 怎样打开win7和vista系统的telnet服务
  3. UVa 11063 - B2-Sequence
  4. 《学习Opencv》第五章 习题6
  5. 世界冠军之路:菜鸟车辆路径规划求解引擎研发历程
  6. php执行跟踪_PHP 代码调试跟踪工具 Ytrace
  7. 物联网:发动一场生态系革命
  8. IBM与红帽联手构建开源混合云环境
  9. linux运维常见的故障,Linux运维中遇到的常见问题
  10. Win系统新建文件夹快捷键
  11. Activiti6自学之路(一)—— Activiti6介绍
  12. Ansys SCDM基本操作
  13. ntag213和215有什么区别_NTAG213、NTAG215和NTAG216NFC标签
  14. 计算机知识怎么记忆,计算器记忆加怎么用
  15. 学习java第14天
  16. 计算机ppt制作教案,教案幻灯片制作
  17. 优秀的流程图是如何制作的?简单的教程讲解
  18. 青龙面板2.8版本+Ninja 保姆级 服务器安装jd代挂教程——(一)
  19. 1-8 (4). RabbitMQ高级特性-消费端ACK
  20. 把音频中的某个人声去掉_能不能把一段音频中的人声和背景音乐分开

热门文章

  1. 如何使用Unity制作一款自己喜欢玩的游戏demo(Unity萌新的进阶技巧)
  2. 百度网盘会员-免费领取
  3. Android Studio将html5网址封装成APP
  4. 微信小程序自定义顶部栏、等十个重要的常见功能总结
  5. 【图像分割】基于收缩系数的粒子群混合引力搜索算法多级图像阈值分割算法研究附matlab代码
  6. ppt怎么修改页面布局
  7. SSL与数字证书,Htpps
  8. Excel表格中重要的数据如何隐藏不显示
  9. canvas教程16-滚动的车轮
  10. Apache-WebLogic plub-in插件的安装