Python中如何将SortedList作为SortedDict的参数并实现正常功能?
实现键有序、值为自动排序列表的SortedDict结构
要实现你需要的{1: [1,2,4], 2: [8,9], 3: [1,5,6]}结构(其中每个值都是自动排序的SortedList),核心是要确保SortedDict的每个键对应的值都是SortedList实例,而不是普通列表。下面是两种可行的方案:
方案一:手动检查并创建SortedList
每次访问键时,先判断键是否存在,不存在则创建对应的SortedList:
from sortedcontainers import SortedDict, SortedList maps = SortedDict() # 向键1添加元素 key = 1 if key not in maps: maps[key] = SortedList() maps[key].add(2) maps[key].add(1) maps[key].add(4) # 向键2添加元素 key = 2 if key not in maps: maps[key] = SortedList() maps[key].add(9) maps[key].add(8)
这种方式逻辑直观,适合简单场景。
方案二:继承SortedDict实现自动创建SortedList
通过继承SortedDict并实现__missing__方法,实现类似defaultdict的自动创建默认值功能:
from sortedcontainers import SortedDict, SortedList class SortedDictOfSortedLists(SortedDict): def __missing__(self, key): # 当访问不存在的键时,自动创建SortedList并赋值 self[key] = SortedList() return self[key] # 使用自定义类 maps = SortedDictOfSortedLists() # 直接操作即可,无需手动创建SortedList maps[1].add(2) maps[1].add(1) maps[1].add(4) maps[2].add(9) maps[2].add(8) maps[3].add(5) maps[3].add(1) maps[3].add(6)
这种方式更简洁,适合频繁添加新键的场景。
你之前遇到问题的原因解析
maps = SortedDict(SortedList()):这里是把空的SortedList作为初始键值对数据源传入,但SortedDict需要的是键值对元组的可迭代对象(比如[(key1, val1), (key2, val2)]),而不是单个值的列表,所以初始化后是空的SortedDict,但插入数据需要明确赋值maps[key] = SortedList(),你误解了构造参数的用途。maps = SortedDict(SortedList):这里把SortedList类作为可迭代对象,会尝试迭代类的属性作为键,导致后续操作逻辑混乱,自然无法正常使用SortedList的方法。- 使用
.append()丢失排序功能:因为你赋值的是普通列表[1,2],而不是SortedList实例,必须确保每个值都是SortedList才能调用.add()/.update()并保持排序。 SortedDict(lambda x:SortedList):SortedDict不支持像defaultdict那样传入默认工厂函数,所以这种写法无效,必须通过实现__missing__方法来实现自动创建默认值。
内容的提问来源于stack exchange,提问作者Avinash Doddi
相关产品推荐
相关产品推荐

