2011-03-22 81 views
0

我試圖把一個小的web應用程序,用戶在最後4位數字的電話號碼輸入,點擊提交,然後顯示所有的字(如果任何),可以使用他們的4個數字在鍵盤上進行。因此,如果用戶輸入「」它們被示出「行爲」「蝙蝠」「」,並且可以從「一個/b/的組合可以由任何換句話說ç 「和」 一個/b/ç 「和」 /ü/v 「和」 p/q/r/s「。尋找字母的所有可能組合使用API​​和Python

我新的Web應用程序和網頁腳本,但我已經找到了如何做的大部分涉及的步驟。我遇到的問題是:

  1. 創建字母

  2. 搞清楚所有可能的組合,其組合實際上是詞

,我覺得你可以做一些這使用API​​但我不知道在哪裏尋找類似的東西。如果我使用某種字典API,可以一次輸入所有可能的組合,或者我必須(大致)81個不同的API調用來檢查每個組合是否是真正的單詞。

我顯然,當涉及到這樣的東西一個相當大的小白,但我想簡單的東西像這樣的嘗試,讓自己熟悉的服務器端網頁腳本開始。另外,如果可能的話,如果我的所有工作都是在Python中完成的,那麼這將是非常棒的,因爲這是我們在我的互聯網應用程序類中使用的語言,並且一開始就堅持使用一種語言會很有意義。無論如何,在此先感謝。

回答

3

閱讀字典並只保留4個字母的單詞,將它們附加到defaultdict(list)的四個字母的數字代碼,當用戶輸入數字給他們就緒列表中的數字或說'沒有字的數字」。

import itertools 
letters = ('',' ', 'abc','def','ghi','jkl','mno','pqrs','tuv','wxyz') 
reverse_dict = dict((str(ind), group) 
        for ind,group in enumerate(letters) 
        for c in group 
        if letters) 

print reverse_dict 
end_nums = '3965' 
print end_nums, 'can produce', tuple(''.join(w) for w in itertools.product(*map(reverse_dict.get, end_nums))) 
word = 'word' 
print('%r = %s' % (word,''.join(key for c in word for key, item in reverse_dict.items() if c in item))) 
+0

這也有幫助。有很多我不知道你可以用這些語言來完成。也感謝這裏。 – 2011-03-23 01:45:37

2

一個天真的做法是

import itertools 

letters = ('','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz') 
good_words = set(['wall','base','cats']) # etc 

def allWords(s): 
    s = [int(ch) for ch in s.zfill(4)] 
    for word in itertools.product(letters[s[0]], letters[s[1]], letters[s[2]], letters[s[3]]): 
     word = ''.join(word) 
     if word in good_words: 
      yield word 

words = list(allWords('2297')) 

更有效的人會預處理所有的好詞到每個電話號碼列表的字典,只是做一個查詢:

import string 
import collections 

class CodingError(Exception): 
    pass 

class TelephoneWords(object): 
    numbers = { 
     'a': '2', 'b': '2', 'c': '2', 'd': '3', 
     'e': '3', 'f': '3', 'g': '4', 'h': '4', 
     'i': '4', 'j': '5', 'k': '5', 'l': '5', 
     'm': '6', 'n': '6', 'o': '6', 'p': '7', 
     'q': '7', 'r': '7', 's': '7', 't': '8', 
     'u': '8', 'v': '8', 'w': '9', 'x': '9', 
     'y': '9', 'z': '9', '0': '0', '1': '1', 
     '2': '2', '3': '3', '4': '4', '5': '5', 
     '6': '6', '7': '7', '8': '8', '9': '9' 
    } 
    wordlen = 4 

    def __init__(self, wordlist=None, fname=None): 
     super(TelephoneWords,self).__init__() 
     self.words = collections.defaultdict(list) 
     if wordlist: 
      self.addwords(wordlist) 
     if fname: 
      with open(fname) as inf: 
       filestr = ' '.join(inf.readlines()).replace(string.punctuation, ' ') 
       self.addwords(filestr.split()) 

    def addwords(self, words): 
     _wordlen = TelephoneWords.wordlen 
     _words = self.words 
     _encode = self.encode 
     for word in words: 
      if len(word)==_wordlen: 
       word = word.lower() 
       try: 
        _words[_encode(word)].append(word) 
       except CodingError: 
        pass 

    def addword(self, word): 
     self.addwords((word,)) 

    def encode(self, s): 
     _numbers = TelephoneWords.numbers 
     res = [] 
     for ch in s: 
      try: 
       res.append(_numbers[ch]) 
      except KeyError: 
       # no corresponding value found 
       raise CodingError("No value available for char '{0}'".format(ch)) 
     return ''.join(res) 

    def seek(self, num): 
     s = str(num).strip().zfill(TelephoneWords.wordlen) 
     try: 
      return self.words[s] 
     except KeyError: 
      raise ValueError("No words found for '{0}'".format(s)) 

    def find(self, num, onErr=None): 
     try: 
      return self.seek(num) 
     except ValueError: 
      return [] if onErr is None else onErr 

def main(): 
    tw = TelephoneWords(fname='four_letter_words.txt') 

    for word in tw.find('2287'): 
     print word 

if __name__=="__main__": 
    main() 

使用拼字遊戲單詞列表,這給我

acts 
bats 
baur 
cats 
caup 
+0

這是非常有幫助的,我試圖跟隨學習python庫,這是幫助。多謝,夥計。 – 2011-03-23 01:37:17