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

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)