我昨天得到了一个关于Rot的作业,我被告知要用代码编写所有26个,或者至少编写一个程序,所以我想我会从字典开始,因为我还要求一定的腐烂我想出了这个。
def generate_rotated_dictionary(n):
for i in range(0, 26):
letter = alphabet_list[i]
new_let = ord(letter) + n
new_let = chr(new_let)
rot_dic.update({letter: new_let})
return(rot_dic)
不幸的是,这不起作用并导致:
{'a': 'b', 'c': 'd', 'b': 'c', 'e': 'f', 'd': 'e', 'g': 'h', 'f': 'g', 'i':
'j', 'h': 'i', 'k': 'l', 'j': 'k', 'm': 'n', 'l': 'm', 'o': 'p', 'n': 'o',
'q': 'r', 'p': 'q', 's': 't', 'r': 's', 'u': 'v', 't': 'u', 'w': 'x', 'v':
'w', 'y': 'z', 'x': 'y', 'z': '{'}
{'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': 'z', 'x': 'z', 'z': '|'}
{'a': 'd', 'c': 'f', 'b': 'e', 'e': 'h', 'd': 'g', 'g': 'j', 'f': 'i', 'i':
'l', 'h': 'k', 'k': 'n', 'j': 'm', 'm': 'p', 'l': 'o', 'o': 'r', 'n': 'q',
'q': 't', 'p': 's', 's': 'v', 'r': 'u', 'u': 'x', 't': 'w', 'w': 'z', 'v':
'y', 'y': '|', 'x': 'z', 'z': '}'}
{'a': 'e', 'c': 'g', 'b': 'f', 'e': 'i', 'd': 'h', 'g': 'k', 'f': 'j', 'i':
'm', 'h': 'l', 'k': 'o', 'j': 'n', 'm': 'q', 'l': 'p', 'o': 's', 'n': 'r',
'q': 'u', 'p': 't', 's': 'w', 'r': 'v', 'u': 'y', 't': 'x', 'w': 'z', 'v':
'z', 'y': '}', 'x': '|', 'z': '~'}
如何用结尾来修复它,我知道这是因为我使用了Ascii值,但是如何让它再次从a开始(数字97)
答案 0 :(得分:3)
因此,如果您需要旋转字母,可以使用以下方法:
import string
alph = string.ascii_lowercase
for i in range(26):
print(''.join([alph[(k + i) % 26] for k in range(26)]))
输出是带偏移的字母字符串:
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyza
cdefghijklmnopqrstuvwxyzab
defghijklmnopqrstuvwxyzabc
.....
zabcdefghijklmnopqrstuvwxy
如果您需要列表而不是字符串,请删除join()
。
如果您需要一些特定的旋转,如13,那么您可以在函数内使用带有参数的代码:
def rot(i):
return ''.join([alph[(k + i) % 26] for k in range(26)])
这将为特定数字提供轮换。 例如:
print(rot(13))
输出:
nopqrstuvwxyzabcdefghijklm
答案 1 :(得分:0)
l = list('abcdefghijklmnopqrstuvwxyz')
n = 1
rot = dict((c, chr(97 + ((ord(c)-97 + n)%26) )) for c in l)
理解力有点密集,所以让我们分解一下:
(c, chr(97 + ((ord(c)-97 + n)%26) ))
产生一个角色的元组及其移位的对应物
chr(97 + ((ord(c)-97 + n)%26) )
制作角色
97 + (ord(c)-97 + n)%26
获取旧字符的值并计算要移位的字符数。
答案 2 :(得分:0)
因此,为了总结,这是一个完整的方法:
# Generates a function which rotate a sequence by an offset
def generate_rot(seq, offset):
l = len(seq)
def rot(c):
n = (seq.index(c) + offset) % l
return seq[n]
return rot
> alpha = map(chr,range(97, 123)) # [a...z]
> rot13 = generate_rot(alpha, 13)
> print(rot13('a'))
n
> print(rot13('n'))
a
> rot21 = generate_rot(alpha, 21)
v
然后,您可以将其绑定到字母表,具体为:
> def generate_alpha_rot(x):
return generate_rot(map(chr,range(97, 123)),x)
# or using a lambda function to create it inline, because why not?
> generate_alpha_rot = lambda x:generate_rot(map(chr,range(97, 123)),x)
> rot22 = generate_alpha_rot(22)
> rot22('a')
w
# Or call it inline:
> generate_alpha_rot(23)('a')
x
答案 3 :(得分:-2)
几乎不值得一个完整的答案,但你想在转换为角色之前采用new_let
的模26。通过进行余数除法,你可以得到指数已经超过26岁
考虑:
>>>26 + 13 # rot13 for z
39
>>>39 % 26
13