我的ascii值字典不起作用

时间:2016-11-29 16:53:49

标签: python ascii

我昨天得到了一个关于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)

4 个答案:

答案 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