在python中针对预设字符串检查生成的字符串

时间:2012-02-25 03:53:56

标签: python python-3.x

我是编程和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))

1 个答案:

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

我认为这就是你想要的。