我一直在玩Python并遇到麻省理工学院的任务,即创建编码信息(Julius Cesar代码,例如你将消息中的ABCD字母改为CDEF)。这就是我想出的:
Phrase = input('Type message to encrypt: ')
shiftValue = int(input('Enter shift value: '))
listPhrase = list(Phrase)
listLenght = len(listPhrase)
ascii = []
for ch in listPhrase:
ascii.append(ord(ch))
print (ascii)
asciiCoded = []
for i in ascii:
asciiCoded.append(i+shiftValue)
print (asciiCoded)
phraseCoded = []
for i in asciiCoded:
phraseCoded.append(chr(i))
print (phraseCoded)
stringCoded = ''.join(phraseCoded)
print (stringCoded)
代码有效但我必须实现不在消息中移动空格和特殊符号的ascii值。
所以我的想法是在范围(65,90)和范围(97,122)范围内选择列表中的值并更改它们,而不更改任何其他值。但是我该怎么做?
答案 0 :(得分:0)
如果你想使用那个巨大的代码:)做一些简单的事情,那你就像这样检查一下:
asciiCoded = []
for i in ascii:
if 65 <= i <= 90 or 97 <= i <= 122: # only letters get changed
asciiCoded.append(i+shiftValue)
else:
asciiCoded.append(i)
但是你知道,python可以使用list comprehension在一行中完成所有这些工作。看这个:
Phrase = input('Type message to encrypt: ')
shiftValue = int(input('Enter shift value: '))
# encoding to cypher, in single line
stringCoded = ''.join(chr(ord(c)+shiftValue) if c.isalpha() else c for c in Phrase)
print(stringCoded)
一点解释:列表理解归结为这个for循环,这更容易理解。抓到了什么? :)
temp_list = []
for c in Phrase:
if c.isalpha():
# shift if the c is alphabet
temp_list.append(chr(ord(c)+shiftValue))
else:
# no shift if c is no alphabet
temp_list.append(c)
# join the list to form a string
stringCoded = ''.join(temp_list)
答案 1 :(得分:0)
使用字符串模块中的maketrans方法要容易得多:
>>import string
>>
>>caesar = string.maketrans('ABCD', 'CDEF')
>>
>>s = 'CAD BA'
>>
>>print s
>>print s.translate(caesar)
CAD BA
ECF DC
编辑:这是针对Python 2.7的
3.5只做
caesar = str.maketrans('ABCD', 'CDEF')
一个简单的函数来返回映射。
>>> def encrypt(shift):
... alphabet = string.ascii_uppercase
... move = (len(alphabet) + shift) % len(alphabet)
... map_to = alphabet[move:] + alphabet[:move]
... return str.maketrans(alphabet, map_to)
>>> "ABC".translate(encrypt(4))
'EFG'
此函数使用模数加法来构造加密的凯撒字符串。
答案 2 :(得分:-1)
asciiCoded = []
final_ascii = ""
for i in ascii:
final_ascii = i+shiftValue #add shiftValue to ascii value of character
if final_ascii in range(65,91) or final_ascii in range(97,123): #Condition to skip the special characters
asciiCoded.append(final_ascii)
else:
asciiCoded.append(i)
print (asciiCoded)