在我最近研究Python中的一个数学问题时,我遇到了一些有关平分库中bisect.bisect_left函数的行为的困惑.这种混乱是由于它的similarity与库中的另一个功能(即bisect.insort_left)而产生的.

在我的特定用例中,我使用了自定义键函数(例如bisect.insort_left(my_list, my_item, key=my_key)),其行为符合预期.此函数使用指定的键为my_list中的my_item确定适当的索引,并相应地插入它.

然而,当try 使用bisect.bisect_left(my_list, my_item, key=my_key)进行类似操作时,我遇到了意外的TypHelp:"其他参数必须是K实例".此错误消息对潜在问题缺乏明确性.

在调查source code of bisect后,我发现了正确的使用模式,如源代码的第71行所示.很明显,正确的用法包括以项作为参数调用键函数,例如:bisect.bisect_left(my_list, my_key(my_item), key=my_key).

我对这一要求背后的设计决策感到好奇.与bisect.insort_left中更直接的使用相比,为什么使用bisect.bisect_left时需要呼叫my_key(my_item)

推荐答案

假设列表项包含大量数据.每个项目都可以是e.G.一个dict

{
    'id': 12,
    'firstname': 'foo',
    'lastname': 'bar',
    'address': ...,
    'phone': ...
    ...
}

这些项目在列表中按id排序,并使用适当的键函数(例如lambda item: item['id']).

如果您想找到一个值为bisect_left的物品,则不需要为整个物品提供其所有数据,但id应该足够了.

docs中,这一点有点神秘地提到了:

为了支持搜索复杂记录,不应用关键功能 到x值.

如果您想插入具有insort_left的项目,当然您必须提供包含所有数据的完整项目.

Python相关问答推荐

在Python中根据id填写年份系列

删除pandas rame时间序列列中未更改的值

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

如何在PIL、Python中对图像应用彩色面膜?

如何通过多2多字段过滤查询集

如何让 turtle 通过点击和拖动来绘制?

未删除映射表的行

如何在虚拟Python环境中运行Python程序?

我如何使法国在 map 中完全透明的代码?

pyscript中的压痕问题

将9个3x3矩阵按特定顺序排列成9x9矩阵

海上重叠直方图

pandas:排序多级列

在含噪声的3D点网格中识别4连通点模式

移动条情节旁边的半小提琴情节在海运

给定高度约束的旋转角解析求解

Polars Group by描述扩展

将一个双框爆炸到另一个双框的范围内

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

有没有办法在不先将文件写入内存的情况下做到这一点?