【发布时间】:2016-05-10 22:54:41
【问题描述】:
对脚本的第二次修改(以下更改)
进行了 cmets 中提到的更改(将 all 重命名为 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)
【问题讨论】:
-
顺便说一句,
all不是变量名的好选择,因为它会影响内置的all()函数。此外,您可以使用内置的exit()函数而不是sys.exit()(假设您实际上需要一个退出函数......)。 -
s/results.append[result]/results.append(result)/ -
@PM2Ring 此外,
all没有在程序的其余部分中引用... -
谢谢@gboffi。那是第一个错误。现在我不知道还有什么问题。我修改了查询并更新了代码。我猜 filter(filter_dict, lst1, lst2) 是错误的
-
@gboffi:当然可以,所以不会造成问题,但这仍然不是一个好主意,而且对于其他阅读代码的人来说有点混乱。