2012-04-10 119 views
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

它会回来,因为它在列表中显示的每一次,但据我可以告诉我在check_combo过程中多次出现同样的结果,通过获得和单词列表

我有一个感觉这个问题可能源于while循环中的get_combos过程,虽然我尝试过修改几乎所有的东西都无济于事,所以我转向那些比我自己更有见识的人寻求帮助。

+0

一些文档字符串/评论可能的帮助。例如,根本不清楚strip_combos应该做什么。 – weronika 2012-04-10 01:17:59

+1

字符串已经可迭代。无需将其转换为列表。而不是单独询问每封信,请执行:'check = raw_input(“请输入5个字母的单词:”)' – 2012-04-10 01:59:45

回答

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

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

看来你想做的事就是让从排列的独特效果。您正在使这太复杂,并在同一时间更慢(因为您使用list作为查找的数据结构)。

具体而言,你想要集合结果,如在一个独特的事物集合的数学概念。幸运的是,Python有这个内置的。

不过,你真的让整个问题太复杂了,而且你的界面是错误的;您不应该在最内层,而是最外层(在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)) 
    ) 
+0

非常好,很多谢谢你这样做! 我想知道是否有一种方法来添加另一个元素到列表中,检查字母是否可以是任何字母的额外字母?例如,如果你有三个字母,A,C和E,它会显示出额外的字母,你可以有ACED或ACES? – Coombes 2012-04-10 02:19:11

+0

如果你可以用A,C,E和一个空白词组成一个单词,那么你可以用A,C和E做出(删除一个字母的单词)。因此,首先构造一组删除了任何字母的英语单词,然后检查。 – 2012-04-10 02:53:29

0

这个小序列如下错误:

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

如果你确实要追加agot无论选择哪个分支,做一个if块外。

相关问题