You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

这种方式更简洁,适合频繁添加新键的场景。

你之前遇到问题的原因解析

  1. maps = SortedDict(SortedList()):这里是把空的SortedList作为初始键值对数据源传入,但SortedDict需要的是键值对元组的可迭代对象(比如[(key1, val1), (key2, val2)]),而不是单个值的列表,所以初始化后是空的SortedDict,但插入数据需要明确赋值maps[key] = SortedList(),你误解了构造参数的用途。
  2. maps = SortedDict(SortedList):这里把SortedList类作为可迭代对象,会尝试迭代类的属性作为键,导致后续操作逻辑混乱,自然无法正常使用SortedList的方法。
  3. 使用.append()丢失排序功能:因为你赋值的是普通列表[1,2],而不是SortedList实例,必须确保每个值都是SortedList才能调用.add()/.update()并保持排序。
  4. SortedDict(lambda x:SortedList):SortedDict不支持像defaultdict那样传入默认工厂函数,所以这种写法无效,必须通过实现__missing__方法来实现自动创建默认值。

内容的提问来源于stack exchange,提问作者Avinash Doddi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:31:08