我希望的是,在一次循环后输出一种排列,进行判断,若合理则跳出大循环,若不合理则更换下一种排列,若遍历了所有排列仍未有合理的结果则输出none
时间: 2024-03-14 08:46:52 浏览: 54
好的,我明白了你的需求。下面是修改后的代码,它会在每次循环后输出一种排列,进行判断,若合理则跳出大循环,若不合理则更换下一种排列,若遍历了所有排列仍未有合理的结果则输出 none。
```python
import itertools
def guess_key2(cipher_text, words):
letter_frequency = get_letter_frequency(cipher_text.lower())
sorted_letters = sorted(letter_frequency.keys(), key=lambda x: letter_frequency[x], reverse=True)
most_common_letters_m = [sorted_letters[:8], sorted_letters[8:16], sorted_letters[-10:]]
f1 = ['e']
f2 = ['a', 'i', 'r', 't', 'o', 'n']
f3 = ['s', 'l', 'c']
f4 = ['u', 'p', 'm', 'd', 'h']
f5 = ['g', 'b', 'y', 'f', 'v']
f6 = ['w', 'k', 'x', 'z', 'q', 'j']
mf = [f1, f2, f3, f4, f5, f6]
mp = [[j for j in range(len(mf[i]))] for i in range(len(mf))]
for row in itertools.product(*mp):
key = {}
for i in range(len(mf)):
for j in range(len(mf[i])):
key[most_common_letters_m[i][row[i][j]]] = mf[i][j]
decrypted_text = decrypt(cipher_text, key)
if is_plaintext(decrypted_text, words):
return key
return None
```
这段代码在原有的基础上增加了一个 for 循环,它会遍历所有的排列,每次生成一种新的排列,并使用这个排列生成一个新的密钥 key。然后使用这个新的密钥 key 解密密文,判断解密后的明文是否合法。如果合法,则返回这个新的密钥 key,跳出整个循环;如果不合法,则继续遍历下一个排列,直到遍历完所有排列。如果遍历完所有排列仍未找到合法的结果,则返回 None。
阅读全文