Python的"key"参数是如何工作的?



我相信我理解排序和分割。当使用keysorted时,我得到了我期望的结果,但是当我调用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)

相关内容

最新更新