【发布时间】:2017-01-04 21:58:03
【问题描述】:
我在 Python 2.7 中编写了一个简短的 Anagram Solver 脚本。
#Import Permutations Module
from itertools import permutations as perm
#Defined Functions
def check(x,y):
#Opens Dictionary File
with open('wordsEn.txt') as dictionary:
'''Checks the permutations against all of the dictionary words and appends
any matching ones to on of the empty lists'''
for line in dictionary:
for i in x:
if i + '\n' == line:
y.append(i)
#Empty Lists that will be appended to later
anagram_perms = []
possible_words = []
#Anagram User Input
anagram = list(raw_input("Input scrambled word: ").lower())
#Creates single list items from the permutations, deletes duplicates
for char in perm(anagram):
anagram_perms.append("".join(char))
anagram_perms = list(set(anagram_perms))
#Uses the defined function
check(anagram_perms, possible_words)
#Prints the number of perms created, then prints the possible words beneath it
print len(anagram_perms)
print '\n'.join(possible_words)
它本质上接受用户输入的字谜,生成所有可能的字母组合并将其放入列表中(使用itertools.permutations),删除所有重复项。然后,它会根据 100000 个单词的字典文本文件检查这些组合中的每一个,将任何匹配的单词放入要打印的列表中。
我遇到的问题是,如果用户输入的单词长度超过 6 个唯一字母,则生成的排列数会导致挂起和崩溃。 9 个字母的字谜将是典型的输入,但显然如果所有字母都不同,这些将输出 362880('9!')排列,这是不可行的。
我想到了几个可能的解决方案:
- 创建一些空列表,这些列表只能包含一定数量的附加排列。一旦这些列表“满”,就会将排列添加到下一个列表中。随后会根据文本文件检查这些列表中的每一个。
- 创建一个包含在循环中的空列表。生成排列并将其附加到列表中,直到达到某个可行的数量,然后列表用于在清空自身并附加到下一个排列数量之前检查文本文件。
- 其他方法生成一定数量的排列,然后暂停该过程,同时根据文本文件检查当前生成的排列,然后恢复并重复。
但是,我对 Python 开发还很陌生,我真的不知道这些是否可行,或者我将如何将它们实现到我的代码中;和其他类似主题的问题并没有真正提供帮助。
到目前为止,如果有人想查看我的代码,我很乐意将其压缩并发布,但为了不再提出这个问题,除非有人要求,否则我会将其省略。 (以上更新)
谢谢!
【问题讨论】:
-
请发布您的代码。
-
请发布您的代码、代码功能的简要信息(BRIEF)、示例输入和所需输出(或您面临的问题)。否则没有人会读这么多,或者如果有人这样做,他们很难理解。请帮助我们帮助你:)
-
@MoinuddinQuadri ,我不确定添加代码但增加问题长度的好处是否值得并鼓励人们阅读,但可以肯定的是,我会继续浓缩并添加它:)
-
StackOverflow 社区可以帮助您解决问题,但我们也需要了解您为解决问题所做的努力。
-
@MoinuddinQuadri 好的,谢谢,上面更新了:)
标签: python python-2.7 permutation itertools anagram