def lookfor(alist, number):
if number in alist:
return alist.index(number)
else:
return "no"
所以基本上我输入了成千上万的数字,我必须发送它们中的每一个“寻找”得到“alist”中“number”索引的输出,或者如果数字是non则得到“no”在那里。 它完美地计算我输入的数字不是很多,但输入xx,xxx-xxx,xxx数字需要几分钟。 有什么建议?
答案 0 :(得分:1)
您的代码会遍历列表,直到找到您要查找的数字(或直到它到达结尾),如果找到了数字,则必须迭代完全相同的数量才能返回索引。为什么不利用.index
方法的行为?请记住,如果列表中没有该号码,则会引发ValueError
。
def lookfor(alist, number):
try:
return alist.index(number)
except ValueError:
return "no"
后记:使用timeit
模块找到最有效的解决方案,但请务必使用各种输入,以便找到最快的解决方案。
答案 1 :(得分:1)
您的代码目前需要在每次调用lookfor
时搜索整个列表。如果alist
足够大,这可能会非常慢。
相反,您应该创建一个字典,将每个元素映射到alist
中的索引。例如,对于alist = [7,4,88]
,您需要:indexmap = {7:0, 4:1, 88:2}
。然后你可以用:
def lookfor(indexmap, number):
return indexmap.get(number, "no")
如果alist
是常量,您可以在初始化期间创建indexmap
:
indexmap = {number: index for index,number in enumerate(alist)}
如果alist
随时间变化,您可以将此词典与alist
一起维护。例如,如果您通常使用append
添加项目,则可以使用:
alist.append(number)
if number not in indexmap:
indexmap[number] = len(alist) - 1
答案 2 :(得分:1)
def index_on(lst):
index = {val:i for i,val in enumerate(lst)}
def lookup(val):
return index.get(val, 'no')
return lookup
search = index_on(alist)
search('123-4567') # => 293 (index in alist)
search('123-4500') # => 'no' (not found)