And*_*der 3 python sorting list ordereddictionary sortedcontainers
SortedListWithKey可以使用 lambda 函数对列表进行排序:
from sortedcontainers import SortedListWithKey
SortedListWithKey([[4, 'last'], [1, 'first']], key=lambda x: x[0])
# Result: SortedListWithKey([[1, 'first'], [4, 'last']], key=<function <lambda> at 0x107f5d730>)
Run Code Online (Sandbox Code Playgroud)
但是假设我需要使用set()只具有唯一值,文档说它还接受key=参数用于按自定义函数排序,但我无法让它工作:
from sortedcontainers import SortedSet
SortedSet([[4, 'last'], [1, 'first']], key=lambda x: x[0])
Run Code Online (Sandbox Code Playgroud)
会抛出以下异常:
values = set(chain(*iterables))
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)
有办法实现这一点吗?
排序集要求元素是可散列的。您的元素是不支持散列的列表。将元素更改为元组,它将起作用:
>>> from sortedcontainers import SortedSet
>>> ss = SortedSet([(4, 'last'), (1, 'first')], key=lambda value: value[0])
>>> ss
SortedSet([(1, 'first'), (4, 'last')], key=<function <lambda> at 0x10fff4848>)
Run Code Online (Sandbox Code Playgroud)
该排序集将按对中的第一个索引对元素进行排序。元组的好处是它们是可散列的,缺点是它们是不可变的。
考虑使用sortedcontainers.SortedDict代替:
>>> sd = SortedDict({4: 'last', 1: 'first'})
>>> sd
SortedDict({1: 'first', 4: 'last'})
>>> sd[2] = 'second'
>>> sd.pop(4)
'last'
Run Code Online (Sandbox Code Playgroud)
排序的字典将按排序顺序保留键,并让您将值更新为您喜欢的任何内容。