Python bisect:传递值而不是返回插入索引

时间:2015-11-05 04:35:18

标签: python python-2.7

我使用此处提到的二进制搜索功能: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]

1 个答案:

答案 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)