我的任务是在单词列表上创建二进制搜索,我已经提出了2个实现(显然还没有找到这个单词尚未找到的情况,但这还不是问题)但是当列表缩小到我要查找的单词时,我的函数没有完成,而是一直运行直到超过最大递归深度。
我进行了印刷,它在dasList[mid]
清楚地显示了这个词,并一遍又一遍地显示出来,直到它最终放弃。
def _bisect2(dasList, word):
mid = int(len(dasList)/2)
if word.lower() > dasList[mid].lower():
return _bisect2(dasList[mid: len(dasList)], word)
if word.lower() < dasList[mid].lower():
return _bisect2(dasList[0: mid], word)
else:
return mid
正在调用
print(_bisect2(fileList, input('Please type a word')))
我正在使用Python 3.0解释器。有什么建议吗?
答案 0 :(得分:1)
您的实现(几乎)适用于我(并且不会显示您使用预先排序的输入描述的行为)。我假设你已经对输入文件进行了排序?稍微修改(工作)的示例发布在下面。
def _bisect2(dasList, word,lidx=0):
mid = int(len(dasList)/2)
if word.lower() > dasList[mid].lower():
return _bisect2(dasList[mid:], word,lidx=lidx+mid)
elif word.lower() < dasList[mid].lower():
return _bisect2(dasList[:mid], word,lidx=lidx)
return lidx+mid
words=sorted(["one","two","three","four","five","twenty","foo"])
print (words)
print (_bisect2(words,'three'))
请注意,您在最后一个部分列表中返回索引(始终为0)...
答案 1 :(得分:1)
这对我来说很好。请注意,最后返回的索引将始终是最小列表中单词的索引,而不是原始列表的索引。
另请参阅>
compare再次对列表执行len,它只是迭代到结尾。切片语法允许您在迭代结束时不使用最后一个数字。
words = "The quick brown fox jumped over the lazy dog".split()
def bisect(words, word):
mid = int(len(words)/2)
if word.lower() > words[mid].lower():
return bisect(words[mid:], word)
elif word.lower() < words[mid].lower():
return bisect(words[0:mid], word)
return mid
words = sorted(words)
print bisect(words, 'dog')
答案 2 :(得分:1)
为什么不使用Python的bisect模块?
来自文档的def index(a, x):
'Locate the leftmost value exactly equal to x'
i = bisect_left(a, x)
if i != len(a) and a[i] == x:
return i
raise ValueError
示例:
>>> a = ['alfred','edward','mary','susan','thomas','wilma']
>>> index(a, 'mary')
2
>>> index(a, 'martha')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in index
ValueError