2016-02-02 197 views
0

第二修改腳本(下所做的更改)蟒蛇問題

製造在評論中提到的更改(改名爲所有print_all,並添加了excepetion,改變了下面的代碼,以反映相同)

然而,執行依然存在,沒有任何理由

初始查詢:

以下是試圖確定一個詞的各種字謎腳本(如網站:http://wordsmith.org/anagram/anagram.cgi?anagram=suchindra&t=1000&a=n):

import sys 
import itertools 
import threading 
from collections import defaultdict 


words_dict = defaultdict(lambda: "") 
def lower_and_nocrlf(s): 
    return s.lower().strip() 

def two_or_more(s): 
    if len(s) >= 1: 
     return 1 
    else: 
     return 0 

def get_perms(cur_iter): 
    lst = [] 
    for i in range(0, 10000): 
     try: 
      lst.append("".join(cur_iter.next())) 
     except: 
      break 
    return lst 

def get_twordlist(z): 
    lst1 = [] 
    lst2 = [] 
    for i in range (1, len(z)): 
     lst1.append(z[:i]) 
     lst2.append(z[i:]) 

    return lst1, lst2 

def filter_dict(x): 
    if x in words_dict.keys(): 
     return x 
    else: 
     return 0 

def main(): 
    print_all = None 
    word = None 

    try: 
     word = sys.argv[1] 
     print_all = sys.argv[2] 
    except: 
     pass 

    if word == None: 
     try: 
      word = sys.stdin.readline() 
      print_all = sys.stdin.readline() 
     except: 
      pass 

    if word == None: 
     sys.exit(1) 

    fd = open('/usr/apps/words', 'r') 

    words = fd.readlines() 

    fd.close() 

    words_lower = map(lower_and_nocrlf, words) 
    words_lower = filter(two_or_more, words_lower) 
    from collections import defaultdict 
    for i in words_lower: 
     words_dict[i] = "" 

    iter = itertools.permutations(word) 

    all_permutations = [] 

    iters = [] 
    for i in range(0, 100): 
     iters.append(iter) 

    result = map(get_perms, iters) 

    main_list = [] 
    for l in result: 
     if l != []: 
      for word in l: 
       main_list.append(word) 

    results = [] 
    try: 
     main_list_len = len(main_list) 
     for index in range(0, main_list_len): 
      percent = (index/len(main_list)) * 100 
      lst1, lst2 = get_twordlist(main_list[index]) 
      result1 = map(filter_dict, lst1) 
      result2 = map(filter_dict, lst2) 
      for index in range(0, len(result1)): 
       if (result1[index] != 0) and (result2[index] != 0): 
        results.append("%s %s" % (result1[index], result2[index])) 

    except KeyboardInterrupt: 
     print("User stopped execution, partial results:") 
     print results 
     sys.exit(1) 
    except Exception: 
      # catches all other types of exception here 
     print(sys.exc_info()) 
      traceback.print_exc() 

    print(results) 
if __name__ == "__main__": 
    try: 
     main() 
    except: 
     sys.exit(0) 
+1

順便說一句,'all'是** **不爲它陰影內置'所有()'函數的變量名的好選擇。另外,你可以使用內建的'exit()'函數而不是'sys.exit()'(假設你實際需要一個退出函數......)。 –

+0

'S/results.append [結果] /results.append(結果)/' – gboffi

+0

@ PM2Ring此外,'all'未在程序的其餘部分中引用... – gboffi

回答

1

因此,您的代碼清楚地執行到print index行,然後在塊內的某處失敗。異常處理程序只捕獲類型爲KeyboardInterrupt的異常 - 即當用戶在其鍵盤上按下Ctl + C時。任何其他錯誤將通過sys.exit(0)方法退出,因此您無法知道錯誤是什麼。

個人而言,我很喜歡traceback模塊,這些打印出來的錯誤,所以我建議你修改你的try catch塊是這樣的:

import traceback 

try: 
    main_list_len = len(main_list) 
    print main_list_len 
    for index in range(0, main_list_len): 
     print index 
     percent = (index/len(main_list)) * 100 
     lst1, lst2 = get_twordlist(main_list[index]) 
     result = map(filter_dict, lst1, lst2) 
     results.append[result] 
except KeyboardInterrupt: 
    print("User stopped execution, partial results:") 
    print("Exception: %s" % (sys.exc_info())) 
    print results 
except Exception: 
    # catches all other types of exception here 
    traceback.print_exc() 

這將允許您調試問題,因爲回溯模塊會給你行號和錯誤信息。

祝你好運!

+0

Thx全部。最後在幾個小時後終於找到了罪魁禍首。它是results.append [結果]。它應該是results.append(結果)。 – user3308983

+0

我仍然覺得它應該繼續for循環,因爲它與被操縱的結果沒有任何關係 – user3308983

0

確定後,一些分析,它看起來像過濾器不接受多於一個列表。第二個問題是因爲我在過濾器中使用多個列表