Selecting specific int values from list and changing them
我一直在玩python,遇到了麻省理工学院的一个任务,那就是创建编码消息(Julius Cesar代码,例如,您将消息中的abcd字母更改为cdef)。这就是我想到的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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)和范围(97122)的列表中选择值,并在不更改任何其他值的情况下更改它们。但我该怎么做呢?
使用字符串模块中的makeTrans方法要容易得多:
1 2 3 4 5 6 7 8 9 10 | >>import string >> >>caesar = string.maketrans('ABCD', 'CDEF') >> >>s = 'CAD BA' >> >>print s >>print s.translate(caesar) CAD BA ECF DC |
编辑:这是针对Python2.7的
用3.5就行了
1 | caesar = str.maketrans('ABCD', 'CDEF') |
。
以及返回映射的简单函数。
1 2 3 4 5 6 7 | >>> 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' |
。
此函数使用modulo addition构造加密的caesar字符串。
如果你想用这个巨大的代码:)做一些简单的事情,那么你要保持这样的检查:
1 2 3 4 5 6 | 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可以使用列表理解在一行中完成全部工作。注意:
1 2 3 4 5 6 7 | 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循环,这更容易理解。抓到什么了?:)
1 2 3 4 5 6 7 8 9 10 11 | 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 2 3 4 5 6 7 8 9 | 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) |
。