基本上我在Python中有一个脚本,它接受几个字母,得到它们的每个组合,然后检查它是否是一个真正的单词(在某种程度上思考拼字游戏)但是由于某种原因它会多次返回相同的单词不希望它这样做,脚本看起来像:
with open("dictionary.txt") as word_file:
english_words = set(word.strip().lower() for word in word_file)
def is_english_word(word):
return word.lower() in english_words
print is_english_word("ham")
print is_english_word("zz")
a = raw_input("Please enter first letter: ")
b = raw_input("Please enter second letter: ")
c = raw_input("Please enter third letter: ")
d = raw_input("Please enter fourth letter: ")
e = raw_input("Please enter fifth letter: ")
check =[a,b,c,d,e]
def get_combos(list):
import itertools
count = len(list)
got = []
combos =[]
while count > 0:
for a in itertools.permutations(list,count):
if a in got:
got.append(a)
else:
got.append(a)
combos.append(a)
count = count - 1
for a in combos:
strip_combos(a)
def strip_combos(list):
count = ''
words = []
for entry in list:
count = count + entry
words.append(count)
check_combo(words)
def check_combo(list):
words = []
got = []
for entry in list:
if is_english_word(entry):
if entry not in words:
print entry
words.append(entry)
get_combos(check)
现在它起作用,因为我的意思是只打印字典中的单词,但它会多次打印相同的单词,例如如果字母是:
a,c,e,s
它将在列表中显示的每个场合返回,但据我所知,我在check_combo过程中省略了多次出现的相同结果,有一个得到的单词列表
我觉得这个问题可能源于某个地方的while循环中的get_combos程序,虽然我已经尝试修改几乎所有的东西都没有用,所以我转向那些比我自己更有知识的人寻求帮助。
答案 0 :(得分:2)
if a in got:
got.append(a)
else:
got.append(a)
combos.append(a)
这几乎肯定不是你的意思:))
您想要做的就是从排列中获得独特的结果。你使这个过于复杂,同时变慢(因为你使用list
作为查找的数据结构)。
具体来说,您需要一组结果,就像在一组独特事物的数学概念中一样。幸运的是,Python内置了这个。
但是,你真的把整个问题弄得太复杂了,你的界面错了;你不应该在最里面的print
结果,而是在最外层(return
之后的适当数据)。虽然您拥有的级别超出了您的需求,但是您手动处理数据列表的工作量太大。只需描述您想要的数据:您可以从瓷砖中制作的“单词”集合的交集,以及字典中实际出现的单词。前者是连接来自多个itertools.permutations
迭代器的字母组合字母的结果集合,您可以将其与itertools.chain
字符串组合在一起。
def get_combos(letters):
return set(
''.join(x)
for x in itertools.chain(*(
itertools.permutations(letters, count)
for count in range(len(letters))
))
).intersection(english_words)
完成。
或者你可以随时过滤这套:
def get_combos(letters):
return set(
''.join(x)
for x in itertools.chain(*(
itertools.permutations(letters, count)
for count in range(len(letters))
))
if is_english_word(''.join(x))
)
答案 1 :(得分:0)
这个小序列看起来不对:
if a in got:
got.append(a)
else:
got.append(a)
# ....
如果您确实要将a
追加到got
,无论选择哪个分支,请在if
块之外执行。