2012-04-10 174 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塊外。

相關問題