3

基本上我有一个 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

它会在每次显示在列表中时返回,但据我所知,我通过 get 和 words 列表省略了在 check_combo 过程中多次出现的相同结果

我有一种感觉,这个问题可能源于某个地方的 while 循环中的 get_combos 过程,尽管我尝试修改几乎所有内容都无济于事,所以我转向那些比我更有知识的人寻求帮助。

4

2 回答 2

2
        if a in got:
            got.append(a)
        else:
            got.append(a)
            combos.append(a)

这几乎肯定不是你的意思:)

看来您想要做的是从排列中获得独特的结果。您使这变得太复杂了,同时速度也变慢了(因为您使用 alist作为查找的数据结构)。

具体来说,您需要一结果,就像一组独特事物的数学概念一样。对你来说幸运的是,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))
    )
于 2012-04-10T01:22:47.353 回答
0

这个小序列看起来不对:

        if a in got:
            got.append(a)
        else:
            got.append(a)
            # ....

如果您真的想追a加到got无论选择哪个分支,请在if块之外进行。

于 2012-04-10T01:05:59.277 回答