Python 使可变元素的排序列表保持最新

Python 使可变元素的排序列表保持最新,python,python-3.x,list,sorting,mutable,Python,Python 3.x,List,Sorting,Mutable,我可以使用python中的sorted或list.sort对以前未排序的列表进行排序 如果我想在列表中添加元素时保持排序,我可以使用sortedcontainers模块 然而,我发现没有现成的方法可以在列表中的元素发生变化时对列表进行排序 从sortedcontainers导入SortedList a=排序列表([],key=len)#按长度对元素进行排序。 a、 添加([3,3,3])#添加项。。 a、 加上([1])#。。随机的 a、 添加([2,2])#。。秩序。 打印(a)#[[1]、[

我可以使用python中的
sorted
list.sort
对以前未排序的列表进行排序

如果我想在列表中添加元素时保持排序,我可以使用
sortedcontainers
模块

然而,我发现没有现成的方法可以在列表中的元素发生变化时对列表进行排序

从sortedcontainers导入SortedList
a=排序列表([],key=len)#按长度对元素进行排序。
a、 添加([3,3,3])#添加项。。
a、 加上([1])#。。随机的
a、 添加([2,2])#。。秩序。
打印(a)#[[1]、[2,2]、[3,3,3]]仍然排序,好的。
#现在,变异一个元素。
a[0]。追加(1)
a[0]。追加(1)
打印(a)#[[1,1,1],[2,2],[3,3,3]]未排序,不正常。
我理解,
SortedList
不负责跟踪其包含的项目的更改并保持排序的最新状态

那么,如何更新排序?
是否有我可以发送给
a
的消息,以便它知道我在索引
0
上做了更改,并且它重新考虑了项目
0
的位置,如
a.update\u sorting\u of(0)

是否有其他专门用于此的数据结构?
我应该自己编写并优化它吗?
我是否应该解决这个问题并改为
a.add(a.pop(0))
与专用解决方案相比,此解决方案的效果如何


我可以放心地假设,在我的例子中,变异
a[0]
并没有触发其他元素的任何更改(或者我只想
a.sort(key=len)
整个事情)。

没有机制来做你想做的事情。即使在对元素进行变异后使用列表,它也会有O(nlogn)复杂性。但是由于
add()
在后台使用对分,所以它只有O(logn)。因此,最好按照您的建议进行操作,即删除待突变元素并读取它。如果有一个函数可以满足你的要求,它可能会在幕后做类似的事情,因为我想不出比对分更好的方法来放置排序顺序可能已经改变的元素

def mutate_element(sortedlist, index, value):
    temp = sortedlist.pop(index)
    temp.append(value)
    sortedlist.add(temp)

您还可以进一步推广各种列表变异方法的功能。例如,
getattr(mylist,'append')
mylist.append

相同。请问这个问题的上下文是什么?你打算如何改变这些元素
a.add(a.pop(0))
对我来说似乎没什么问题。除了每次想使用列表时都求助于它之外,没有任何故障保护解决方案。您可以将sortedlist封装到自定义容器类(合成/委派)中,并拦截各种
\uuu getitem\uuuu
append
etc调用,但如果某个元素通过对它的另一个引用发生变异,你的容器会知道的。@iago lito你可能想用真实的用例和约束来编辑你的问题,而不是一个通用的玩具示例-这里没有一个适合所有人的答案,最好(或“最差”)的解决方案将是具体的。你是否已经在更高的级别上对图进行了分类,例如按节点数进行分类,边的数量,最小/最大度数,这样您就可以只根据其类别中的图形来测试下一个图形?当然,您可以更进一步,例如使用所有度数的排序列表。或者使用更复杂的东西,如图形直径或平均距离。这基本上围绕着“
a.add(a.pop(0))
消息”。我知道没有比这更好的方法了,而且已经相当不错了。谢谢:)@iago lito我看到了,但我不清楚你是在总结方法的同时遗漏了关键步骤,还是没有意识到
a.add(a.pop(0))
并不完全符合你的要求,所以我发布了答案。答案的要点,虽然没有明确说明,但是因为诉诸列表比重新输入变异元素更昂贵,即使有一种方法可以做你想做的事情,它也可能会在幕后做类似的事情。你明白我的意思:)我也同意,优化方法本质上也会做类似的事情。更进一步,你认为做
temp=a.pop(0)之间会有区别吗;临时附加(1);a、 添加(临时)
并执行
a[0]。追加(1);a、 添加(a.pop(0))
?这将是一个潜在的/危险的差异,因此最好确保X)没有差异,因为当您再次调用
a.add()
时,元素已经变为新的大小。但我个人认为第一种方法更明确。顺便说一句,如果你处理很多元素,你只需要在
index+1
的情况下删除并读取一个元素。否则就地修改不会影响排序顺序。但是这是特定于
len
作为排序函数的,所以我省略了它。