字谜脚本中的python问题

时间:2016-02-02 08:25:34

标签: python anagram

对脚本的第二次修改(下面做出的更改)

进行了评论中提到的更改(将所有内容重命名为print_all,并添加了例外情况,更改了以下代码以反映相同内容)

然而,执行仍然没有任何理由退出

初始查询:

以下是尝试识别单词的各种字谜的脚本(如网站中所示: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)

2 个答案:

答案 0 :(得分: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()

这将允许您调试问题,因为回溯模块将为您提供行号和错误消息以供使用。

祝你好运!

答案 1 :(得分:0)

确定经过一些分析后,看起来过滤器不接受多个列表。第二个问题是因为我在过滤器中使用了多个列表