在我最近用 Python 解决数学问题时,我对 bisect 库中的
bisect.bisect_left
函数的行为遇到了一些困惑。之所以会出现这种混乱,是因为它与库中的另一个函数“相似”,即“bisect.insort_left
”。在我的特定用例中,我使用了自定义按键功能,例如 bisect.insort_left(my_list, my_item, key=my_key)
,其行为符合预期。该函数使用指定的键确定
my_item
在 my_list
中的适当索引并相应地插入它。但是,当尝试使用 bisect.bisect_left(my_list, my_item, key=my_key)
进行类似操作时,我遇到了意外的 TypeError:“其他参数必须是 K 实例”。此错误消息缺乏关于根本问题的明确性。
在研究bisect的源代码时,我发现了正确的使用模式,如源代码第71行所示。很明显,正确的用法包括使用该项目作为参数来调用关键函数,如下所示:bisect.bisect_left(my_list, my_key(my_item), key=my_key)
。
my_key(my_item)
中更直接的用法相比,为什么使用
bisect.bisect_left
时需要调用 bisect.insort_left
?bisect
更加灵活。假设您有一些带有两个坐标
Point
和 x
的 y
类。您现在可以使用 bisect
来排序 x
:def get_x(p):
return p.x
bisect.bisect_left(my_list, p, get_x)
或者您可以决定排序
y
:
def get_y(p):
return p.y
bisect.bisect_left(my_list, p, get_y)
有时,使用 lambda 函数可以很方便地达到相同的效果:
bisect.bisect_left(my_list, p, lambda q: q.x)