python - 使可变元素的排序列表保持最新
问题描述
我可以使用sorted
或list.sort
在 python 中对之前未排序的列表进行排序。
如果我希望我的列表在添加元素时保持排序,我可以SortedList
从sortedcontainers
模块中使用。
但是,我发现没有现成的方法来保持这个列表排序,因为其中的元素发生了变异。
from sortedcontainers import SortedList
a = SortedList([], key=len) # sort elements by their length.
a.add([3,3,3]) # add in..
a.add([1]) # .. random..
a.add([2,2]) # .. order.
print(a) # [[1], [2, 2], [3, 3, 3]] still sorted, okay.
# Now, mutate one element.
a[0].append(1)
a[0].append(1)
print(a) # [[1, 1, 1], [2, 2], [3, 3, 3]] not sorted, not okay.
我了解,SortedList
它不负责跟踪其中包含的项目的更改并保持排序最新。
那么如何更新排序呢?
有没有我可以发送的消息,a
所以它知道我已经在 index 处进行了更改,0
它会重新考虑 item 的位置0
,比如a.update_sorting_of(0)
.
是否有另一种专门用于此的数据结构?
我应该自己编写并优化它吗?
我应该解决它a.add(a.pop(0))
吗?
与专用解决方案相比,此解决方法如何?
我可以放心地假设,a[0]
在我的情况下,变异并没有触发其他元素的任何变化(否则我会只是a.sort(key=len)
整个事情)。
解决方案
没有机制可以做你想做的事。即使你在改变一个元素后使用一个列表,它也会有 O(nlogn) 的复杂性。但是因为add()
在幕后使用了 bisect,所以它只有 O(logn)。所以最好按照你的建议做一些事情,即删除要变异的元素并读取它。如果有一个功能可以满足您的要求,它可能会在幕后做类似的事情,因为我想不出比 bisect 更好的方法来放置排序顺序可能已更改的元素。
def mutate_element(sortedlist, index, value):
temp = sortedlist.pop(index)
temp.append(value)
sortedlist.add(temp)
您还可以进一步概括各种列表变异方法的功能。例如getattr(mylist, 'append')
与 相同mylist.append
。
推荐阅读
- java - maven依赖没有正确编译成war
- javascript - 将容器的最后一个元素居中在容器的中间
- protocol-buffers - .proto 文件中的“选项”关键字是什么意思?
- python - 如何将变量中的文本插入到我制作的 kivy 标签中?
- javascript - React 中的状态没有更新
- c - 释放树中的节点
- php - 如何使用`|`分隔符使用codeigniter表单发送多个复选框数据
- c# - 当它们都有一个thread.sleep时,我如何在x时间内运行一堆线程?
- github - GitHub Webhook 未向我的 Discord 频道发送有关项目选项卡更改的消息
- c# - c#更快的n元笛卡尔积