Python 3使用SortedDict中的自定义键对容器进行排序

2024-09-30 06:20:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个树形(或者严格的,像STD::从C++中映射,这样我就可以插入一个键值对,并方便地访问下一个和以前的元素)数据结构来保存一些信息,但是自从标准以来 Python缺少这种结构,我决定使用SortedContainers库中的SortedDict

我需要SortedDict来保存某些元素的索引,这些元素按y坐标排序。
这很简单:

D = SortedDict()
D[y_coord_1] = element_1_index
D[y_coord_2] = element_2_index
...

然后,总体思路发生了一些变化,我还需要索引按其第二个坐标和类似布尔值(0或1)排序。它们都存储为一个元组。 例如,它的工作原理如下:

D[(y_c_1, x_c_1, 1)] = element_1_index
D[(y_c_2, x_c_2, 0)] = element_1_index
...

第三个元组元素是零还是一对问题本身没有影响

我注意到,这些元素并不像我所期望的那样由元组的第三个元素排序。 为了解决这个问题,我创建了sortedct()的子类:

class StateTree(SortedDict):
    def _in_key(x : (), y : ()) -> bool:
        if x[0] < y[0]: return 1
        elif x[0] > y[0]: return -1
        else:
            if x[1] < y[1]: return 1
            elif x[1] > y[1]: return -1
            else:
                if x[2]: return 1
                else: return -1
                return 0    
  
    def __init__(self, line_coefs, *args, **kwargs):
        super().__init__(key=cmp_to_key(StateTree._in_key) , *args, **kwargs)
        ...

问题是,现在当我尝试在dict中插入一个元素时,出现以下错误:

TypeError: '<' not supported between instances of 'tuple' and 'str'

当然,我插入了一个数值元组,例如(10,4,0),我不知道为什么这个错误会不断出现。我想我可能用错了关键字段,但我不确定

此错误的原因是什么?如何正确设置此dict的键? 如果不可能,我可以使用其他什么数据结构?我需要把它整理好,我需要 O(logn)min、next、previous、find、remove和insert


Tags: key元素数据结构indexreturnif排序def

热门问题