值为x的Python对分是长度为1的数组
我试图理解以下代码:值为x的Python对分是长度为1的数组,python,bisect,Python,Bisect,我试图理解以下代码: i=bisect.bisect(self.A[id+1])-1 在此,开发人员在bisect()中将[id+1]传递为x(目标值)。在和中,我没有看到任何地方提到x可以是长度为1的数组 代码的目标是在A中查找具有id或A中最大id的元组的值。例如: A = [[0, 0], [2, 4]] id = 1 Output = 0 // Here: 1 isn't in A so return value 0 from id 0 which is the biggest id
i=bisect.bisect(self.A[id+1])-1
在此,开发人员在bisect()
中将[id+1]
传递为x
(目标值)。在和中,我没有看到任何地方提到x
可以是长度为1的数组
代码的目标是在A
中查找具有id
或A
中最大id的元组的值。例如:
A = [[0, 0], [2, 4]]
id = 1
Output = 0 // Here: 1 isn't in A so return value 0 from id 0 which is the biggest id < input id
A = [[0, 0], [2, 4], [3, 12]]
id = 3
Output = 12 // 3 is in A so return 12
i=bisect.bisect\u left(id,id+1)-1//返回0
但是,bisect_left()
将返回以下问题的错误答案:
A = [[0, 0], [2, 4], [3, 12]]
id = 3
i = bisect.bisect(self.A, [id + 1]) - 1 // returns 12 which is correct
ids = [0, 2, 3]
i = bisect.bisect_left(ids, id + 1) - 1 // returns 4
那么为什么会有区别呢?传递
[x]
是如何工作的?使用列表作为参数进行二分法没有特殊情况<代码>列表
s可以像其他任何东西一样进行比较,而且比较在元素上是字典式的。因此,如果您在int
s的两个元素list
的list
中搜索[id+1]
,您将找到内部列表的id+1
作为第一个元素的位置。由于短于两个元素列表
s,它总是比第一个元素相同的任何元素都要小,因此对分左
将给出相对于相等元素的一致位置,总是在相等元素运行的最开始(而如果您通过了[id+1,0]
,您将在第二个int
为负数的任何元素后面进行搜索。快照数组有人吗?=)作为值列出并不是什么特例。完成+-功夫是为了获得给定快照id的正确快照id、值对,而不管在该id的生命周期中是否为密钥设置了值。哈哈@schwobasegll,你找到我了。因此,如果我不想做这种“魔术”,而只是取出id
来找到正确的索引,我应该如何做呢?您不会显示如何继续检索实际值(4
或12
)。从这两种方法中得到的索引应该是相同的。我想出来了。我对2个I
结果感到困惑<另一个开发人员代码中的code>i
是A中的索引,myi
是id中的索引。但是,获取id
会使解决方案的运行速度大大降低。我的解决方案是使用dict和一个简单的while循环,比使用列表的二进制搜索要快?是的,线性作用会否定整个对分法。您可以将ID和值存储在单独的列表中,从一个列表中通过对分获取索引,并使用索引从另一个列表中检索值。谢谢。您的回答解释了为什么传递[x]
有效。我假设取出id
并尝试对它们进行bisect
,我应该得到相同的结果,但我没有。你能帮我理解吗?@Vieta:它不起作用,因为int
与list
不可比。如果1<[1,2]:,则无法测试,这是毫无意义的(至少在Python中,我确信有些奇怪的语言中,列表结构深深嵌入到语言中,这可能是允许的)。如果[1]<[1,2]:
测试,则可以。在内部,bisect
正在进行这种形式的测试;如果要搜索的值与要搜索的列表中的元素类型不匹配,则会出现TypeError
s。我的意思是,当我对id
列表本身而不是元组使用bisect
时。据推测,它应该像预期的那样工作,对吗?因为对分将在ID列表中找到插入索引。@Schwobasegll:谢谢,您的评论很有意义。如果我要使用查找ID得到正确的结果,我应该怎么做?@Vieta:在您的示例中,从列表[list[int]
切换到列表[int]
时,您一直在从对分.bisect
(相当于对分.bisect.bisect\u right
)切换到对分.bisect\u left
。如果你是一致的<代码>左对分
和右对分(
)在某些情况下仍然会有所不同,因为0
等于0
,但是[0]
小于[0,任何东西]
(正如我在回答中指出的)。