Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
值为x的Python对分是长度为1的数组_Python_Bisect - Fatal编程技术网

值为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中的索引,my
i
是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,任何东西]
(正如我在回答中指出的)。