【发布时间】:2015-08-29 03:29:50
【问题描述】:
我是 python 新手,一直在编写一个练习程序来检查 400 万个单词的列表中的密码。我原来的解决方案是这样的(如果密码包含在列表中,将打印 true):
import sys
from bisect import bisect_left
script, password, pwlist = sys.argv
password = password+"\r\n"
l=[line for line in open(pwlist)]
l.sort() #Must be sorted for bisect_left to work
print (password <= l[-1]) and (l[bisect_left(l, password)] == password)
然后我意识到我可以使用 index 方法,如下所示:
import sys
script, password, pwlist = sys.argv
password = password+"\r\n"
l=[line for line in open(pwlist)] #Note we don't need to sort this time
#Catch the "not in list" exception
try:
print (password <= l[-1]) and (l[l.index(password)] == password)
except ValueError:
print "False"
我的第二个版本大大减少了执行时间,因为列表不需要排序。我是否以正确的方式处理了这个问题? index() 方法是如何工作的?如果它适用于未排序的列表,它肯定不会进行二进制搜索。对此的任何建议将不胜感激。
【问题讨论】:
-
AFAIK
index只是按顺序遍历列表。 O(N) 可能比 O(N*log(N)) 排序加上 O(log(N)) 二进制搜索要快。顺便说一句,你有没有考虑过print password in l?
标签: python