我使用此处提到的二进制搜索功能:When are bisect_left and bisect_right not equal?,但我想跳过列表e
中不包含的值,而不是返回False。 / p>
from bisect import bisect_left
def binsearch(l,e):
index = bisect_left(l,e)
if index == len(l) or l[index] != e:
return False
return index
l = [1, 2, 3, 6, 7, 8, 9]
e = [7, 9, 2, 4, 7]
index = []
for i in e:
index.append(binsearch(l,i))
print index # [4, 6, 1, False, 4]
我尝试用return False
替换pass
,但我得到了列表中不存在值的索引。有没有办法简单地传递一个值,如果它不在l
并输出[4, 6, 1, 4]
?
答案 0 :(得分:1)
如果您使用return
语句中的pass
替换if
,就好像if
不存在一样。这就是你返回索引的原因。
您可以做的是返回一个标记值或一个元组,将索引与True
/ False
指示项目相关联。
Sentinel风格:
if index == len(l) or l[index] != e:
return -1
return index
元组风格:
if index == len(l) or l[index] != e:
return False, None
return True, index
要完成图片,您需要将一些逻辑放入您构建最终列表的位置。元组形式的示例:
for i in e:
found, ind = binsearch(l,i)
if found:
index.append(ind)