如何在Python sortedcontainers中按Key正确使用SortedSet?
解决SortedSet中key参数无法正常工作的问题
我懂你遇到的麻烦了——SortedListWithKey用lambda自定义排序键的方式特别顺手,但换到SortedSet想同时实现自定义排序+元素唯一性时,却怎么都搞不定。其实这俩对key参数的处理逻辑有细微差别,我来给你理清楚正确用法:
先看正确的使用示例
假设你想处理类似[4, 'last']这样的元素,按第一个值排序,同时保证整个元素的唯一性(注意:SortedSet的唯一性是看原始元素,不是转换后的key值),正确写法是这样:
from sortedcontainers import SortedSet # 初始化时直接传入key参数,指定排序用的键函数 my_sorted_set = SortedSet([[4, 'last'], [1, 'first'], [4, 'last']], key=lambda x: x[0]) print(my_sorted_set) # 输出:SortedSet([[1, 'first'], [4, 'last']], key=<function <lambda> at 0x...>)
你大概率踩了这些坑
混淆唯一性判断依据:
SortedSet不会根据key转换后的值判断元素是否重复,只会看原始元素本身。比如你传入[[4, 'last'], [4, 'another']],这俩会被当成不同元素保留,只是排序时都按x[0]=4来排。自定义对象没处理相等性:
如果你存的是自定义类的实例,得自己实现__eq__和__hash__方法,不然SortedSet没法判断元素是否重复。比如存储用户对象时,按用户ID判断唯一性,按年龄排序:
from sortedcontainers import SortedSet class User: def __init__(self, user_id, age, name): self.user_id = user_id self.age = age self.name = name def __repr__(self): return f"User(id={self.user_id}, age={self.age}, name='{self.name}')" # 按user_id判断是否相等 def __eq__(self, other): return self.user_id == other.user_id # 配合__eq__实现哈希 def __hash__(self): return hash(self.user_id) # 按年龄排序的SortedSet users_set = SortedSet( [User(1, 25, "Alice"), User(2, 22, "Bob"), User(1, 25, "Alice")], key=lambda user: user.age ) print(users_set) # 输出:SortedSet([User(id=2, age=22, name='Bob'), User(id=1, age=25, name='Alice')], key=<function <lambda> at 0x...>)
- key参数传错时机:
一定要在初始化SortedSet的时候传入key参数,没法后续动态修改这个排序规则哦。
内容的提问来源于stack exchange,提问作者Ander
相关产品推荐
相关产品推荐

