2016-02-28 34 views
1

我一直在玩Python和对面麻省理工学院,这一任务是创建编码消息(凯撒代码中,例如,你的消息改变ABCD字母CDEF)来了。这是我想出了:选择从列表中选择特定int类型,并改变它们

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)范围内选择列表值和改变他们,而我不会改变任何人。但我该怎么做?

+0

你可以使用'isalpha()'方法http://stackoverflow.com/questions/15558392/how-to-check-if-character-in-string-is-a-word-character-python – RinaLiu

回答

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) 
+0

如果你不希望有 “幻数” 左右浮动,'65','90','97'和'122'是'ORD( 'A')','ORD( 'Z')','ORD ('a')'和'ord('z')'。 – pzp

+0

我知道,但是从OP看来,推测OP也知道它似乎是合理的。所以使用这些神奇的数字没有什么坏处保重,两个OP意味着不同。 :) –

+0

Shadowfax你能告诉我,还是将我连接到解释,那些双括号是做什么的?对于这里egsample:stringCoded = ''。加入(temp_list) – RadekE

-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) 
+0

对于每种情况,都会丢失'Z'和'z'。去搞清楚。 –

+1

'range()'排除端点。你想'范围(65,91)'和'范围(97,123)'。 – pzp

+0

它只是因为如果u试图为Z/Z添加位移值即其90 +任何移位或122+任何偏移值将它带到其他非alphacharacters> 91或122 – user5993403

0

容易得多它是从string模块使用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' 

该函数使用模加法构造加密的凯撒字符串。

+0

的OP标签为python 3.x.你的是Python 2.x.并没有考虑到用户输入的shiftValue。如果要处理A-Z和a-z,那将非常笨拙。 –

+0

谢谢Shadowfax。显然我是一个懒惰的读者;-)我已更新我的评论以反映您的评论。 – jazz