我相信我理解排序和分割。当使用key
和sorted
时,我得到了我期望的结果,但是当我调用bisect(..., key=fn)
时,我不理解结果。可能是一个bug?我该在哪里报告呢?
from bisect import bisect
fn = lambda tup: (tup[0], tup[1] % 2, tup[1])
lst = [('a', 2), ('a', 1), ('a', 5), ('b', 3)]
x = ('a', 3)
print(sorted(lst, key=fn)) # [('a', 2), ('a', 1), ('a', 5), ('b', 3)]
print(sorted(lst + [x], key=fn)) # [('a', 2), ('a', 1), ('a', 3), ('a', 5), ('b', 3)]
# so `x` sorts into position 2.
lst.sort(key=fn)
print(bisect(lst, x, key=fn)) # 3 (!)
lst_fn = sorted([fn(item) for item in lst])
print(bisect(lst_fn, fn(x))) # 2
我不明白为什么x
会排序到位置3。我是不是完全错过了什么?
https://github.com/python/cpython/issues/91966
问题已被报告。希望文档能尽快更新。
bisect
期望查找值x
已经应用了key
。
print(bisect(lst, fn(x), key=fn)) # 2
我认为这是非常违反直觉的。毕竟,我们正在寻找插入x
的位置,而不是fn(x)
。