【发布时间】:2017-02-09 20:42:26
【问题描述】:
我阅读了 that question 关于如何在元组列表上使用 bisect 的信息,并使用该信息来回答 that question。它有效,但我想要一个更通用的解决方案。
由于bisect 不允许指定key 函数,如果我有这个:
import bisect
test_array = [(1,2),(3,4),(5,6),(5,7000),(7,8),(9,10)]
我想为那些(x,y) 元组找到x > 5 的第一项(根本不考虑y,我目前正在这样做:
bisect.bisect_left(test_array,(5,10000))
我得到了正确的结果,因为我知道没有y 大于10000,所以bisect 将我指向(7,8) 的索引。如果我改用1000,那就错了。
对于整数,我可以这样做
bisect.bisect_left(test_array,(5+1,))
但在一般情况下可能存在浮点数,如何在不知道第二个元素的最大值的情况下做到这一点?
test_array = [(1,2),(3,4),(5.2,6),(5.2,7000),(5.3,8),(9,10)]
我试过这个:
bisect.bisect_left(test_array,(min_value+sys.float_info.epsilon,))
它没有用,但我试过这个:
bisect.bisect_left(test_array,(min_value+sys.float_info.epsilon*3,))
它奏效了。但这感觉像是一个糟糕的黑客攻击。有什么干净的解决方案吗?
【问题讨论】:
-
有这个
SortedCollectioncode recipe是在bisect docs中推荐的,用于使用bisect和key函数。 -
是的;我可以复制对分代码并更改比较功能(当您想创建一个快速的答案时不太方便)
-
@schwobaseggl 不错的发现。我不知道如何在不依赖链接的情况下将其转化为答案。如果您找到方法,我会投票并接受。他们什么时候会在库或语言本身中集成如此出色的食谱?
标签: python comparison tuples bisect