在下面的library的帮助下,我创建了一个二叉搜索树。我做了一个比较函数来确定节点应该去哪里。比较函数确定每个段的当前y值
from sortedcontainers import SortedList
def findCurrentY(segment):
#uses current_x to calculate value of y...
def compare(segment):
position = findCurrentY(segment)
return position
global current_x
myList = SortedList(key = compare)
segments = [segment1,segment2]
current_x = 1
for segment in segments:
myList.add(segment)
print(MyList)
current_x = 2
print(MyList)
current_x = 3
print(MyList)
这就是我的输出的样子
For current_x = 1:
MyList = [segment2,segment1] #y value of segment1 is higher than segment2
For current_x = 2:
MyList = [segment2,segment1]
For current_x = 3:
MyList = [segment2,segment1]
它显示了相同的三倍,因为它只计算了比较函数。当我的当前_x更改时,如何动态更改比较函数,而不删除每个元素并将其再次添加到列表中
所以它必须看起来像这样
For current_x = 1:
MyList = [segment2,segment1] #segment 1 has higher y value
For current_x = 2:
MyList = [segment2,segment1] #segment 1 has higher y value
For current_x = 3:
MyList = [segment1,segment2] #segment 1 has **lower** y value
更改
current_x
的值不会按预期更改列表。这是因为,如果我们更改compare
函数(即,根据生成的新y值重新排序),整个列表需要再次更新,这个过程对于这个数据结构是必要的请参见下面的示例,以查看此处使用全局变量带来的意外结果
显然,
[5, 4, 2, 3, 5]
不是我们期望的结果。因此,一种更安全的方法是将原始列表复制到一个新的SortedList
中,而不是就地更改键函数所以,根据你给出的图,我们可以定义分段1和分段2
然后,我们可以尝试创建按结果y和x排序的新列表
上述代码输出:
但是,如果您坚持要对列表进行动态排序,则可以实现一个包装器类,其中
self.list
始终引用按预期排序的列表相关问题 更多 >
编程相关推荐