文档缺少示例…您如何基于密钥使用 bisect.insort_left)_
?
尝试根据键插入。
bisect.insort_left(data, ('brown', 7))
将插入放在 data[0]
。
从文档…
bisect.insort_left(
a, x, lo=0, hi=len(a))
按排序顺序将 x 插入 a 中。这相当于
a.insert(bisect.bisect_left(a, x, lo, hi), x)
假设 a 已经排序。请记住,O(log n) 搜索是由缓慢的 O(n) 插入步骤主导的。
示例用法:
>>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]
>>> data.sort(key=lambda r: r[1])
>>> keys = [r[1] for r in data] # precomputed list of keys
>>> data[bisect_left(keys, 0)]
('black', 0)
>>> data[bisect_left(keys, 1)]
('blue', 1)
>>> data[bisect_left(keys, 5)]
('red', 5)
>>> data[bisect_left(keys, 8)]
('yellow', 8)
>>>
我想把 ('brown', 7)
之后 ('red', 5)
bisect.insort_left
data
5EB0623BCD3EEMANING中的排序列表中现在 bisect.insort_left(data, ('brown', 7))
把 ('brown', 7)
放在 data[0]
…因为我没有使用键来插入…文档插入不使用不显示文档按键。
原文由 Merlin 发布,翻译遵循 CC BY-SA 4.0 许可协议
这与
SortedCollection
配方 的作用基本相同bisect
文档 在其末尾提到 : 部分,但与insert()
配方,显示的功能支持键功能。正在做的是一个单独的排序
keys
列表与排序的data
列表并行维护以提高性能(它比在每次插入之前创建键列表更快,但保持它周围和更新它不是严格要求的)。 ActiveState 配方为您将其封装在一个类中,但在下面的代码中,它们只是传递的两个独立的独立列表(因此与它们同时持有相比,它们更容易不同步在食谱类的实例中)。后续问题:
可以使用
bisect.insort_left
吗?不,您不能简单地使用
bisect.insort_left()
函数来执行此操作,因为它不是以支持键函数的方式编写的——相反,它只是比较传递给它的整个项目以插入,x
,在其if a[mid] < x:
语句中包含数组中的全部项目之一。您可以通过查看bisect
中模块的源代码来理解我的意思Lib/bisect.py
。以下是相关摘录:
您可以修改以上内容以接受可选的键函数参数并使用它:
…并这样称呼它:
实际上,如果您要编写自定义函数,为了以不必要的通用性为代价提高效率,您可以免除添加通用键函数参数,而只是对所有内容进行硬编码以按照数据所需的方式进行操作你有的格式。这将避免在进行插入时重复调用键函数的开销。
…在不传递 keyfunc 的情况下以这种方式调用: