理解Python的bisect库:阐明bisect_left的用法

问题描述 投票:0回答:1

在我最近用 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
    

python bisect
1个回答
0
投票
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)

© www.soinside.com 2019 - 2024. All rights reserved.