从列表中选择特定的int值并进行更改

时间:2016-02-28 13:19:15

标签: python python-3.x

我一直在玩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)范围内选择列表中的值并更改它们,而不更改任何其他值。但是我该怎么做?

3 个答案:

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