我是编程和Python的初学者。我已经完成了大部分学习Python的艰辛之路,而我现在正在使用Python创建自己的计算机游戏。
"发明"预订,您可以在其中创建一个简单的密码程序,该程序使用密钥编号对用户提交的短语进行加密,以抵消ASCII代码并使用该密钥编号进行decrpyt。在本章的后面,一个"蛮力"添加了解密方法,该方法贯穿所有26个可能的消息翻译并打印出每个消息。
我想更进一步,只打印正确翻译的消息,而不是必须查看所有26个。我创建了一个包含英语常用单词的字符串,并尝试了各种方法来测试针对该字符串的每个生成的输出。到目前为止,我一直无法找到任何有效的方法。
这是解密代码:(缩进块在IDLE中是正确的但在这里不正确。)
def getTranslatedMessage(mode, message, key):
if mode[0] == 'd':
key = -key
translated = ''
for symbol in message:
if symbol.isalpha():
num = ord(symbol)
num += key
if symbol.isupper():
if num > ord('Z'): num -= 26
elif num < ord('A'): num += 26
elif symbol.islower():
if num > ord('z'): num -= 26
elif num < ord('a'): num += 26
translated += chr(num)
else: translated += symbol
return translated
所以当用户选择&#34;蛮力&#34;模式和消息中的类型,调用以下函数:
def brute():
for key in range(1, MAX_KEY_SIZE + 1):
if words in getTranslatedMessage('decrypt', message, key).split():
print(getTranslatedMessage('decrypt', message, key))
最后,这是我要检查的单词列表:
words = 'and is the but or not may in it why how who where'.split()
编辑: 这就是我现在拥有的。它没有用......
def brute():
for key in range(1, MAX_KEY_SIZE + 1):
if set(getTranslatedMessage('decrypt', message, key)).intersection(words_set):
print(getTranslatedMessage('decrypt', message, key))
答案 0 :(得分:3)
问题归结为这一行:
if words in getTranslatedMessage('decrypt', message, key).split():
您无法比较这样的列表:
>>> a = [1,2,3]
>>> b = [2,3,4]
>>> if a in b:
... print ("yep!")
...
>>>
if words in somelist
检查单词是某个列表的元素。例如:
>>> a in b
False
>>> a in [[1,2,3],4,5]
True
但是你还有其他一些选择。
>>> if set(a).intersection(b):
... print("yep!")
...
yep!
>>> if any(i in b for i in a):
... print("also yep, but slow")
...
also yep, but slow
>>> bset = set(b)
>>> if any(i in bset for i in a):
... print("still yep, not so bad")
...
still yep, not so bad
等等,具有不同的效率水平。集合具有非常快速的成员资格测试,因此如果性能有问题,通常最好使用它们。第一个可以采取len(a)* len(b)步骤。修复此问题(并更改粗体以接受消息参数)后,我发现您的代码给出了:
>>> m = getTranslatedMessage("d", "this may work", 17)
>>> print(m)
cqrb vjh fxat
>>> brute(m)
this may work
我认为这就是你想要的。