脚本多次返回相同的值

时间:2012-04-10 00:51:21

标签: python anagram

基本上我在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程序,虽然我已经尝试修改几乎所有的东西都没有用,所以我转向那些比我自己更有知识的人寻求帮助。

2 个答案:

答案 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块之外执行。