有没有办法按值对sortedcontainers.SortedDict
中的项目进行排序,以便SortedDict始终根据值而不是按键按排序顺序维护其项目?
来自sortedcontainers的标准示例显示,SortedDict中的项目将按字典键自动排序:
>>> from sortedcontainers import SortedDict
>>> sd = SortedDict({'c': 3, 'a': 1, 'b': 2})
>>> sd
SortedDict({'a': 1, 'b': 2, 'c': 3})
到目前为止,我设法在创建期间按值(日期时间)对dict中的项目进行排序:
>>> import datetime
>>> from sortedcontainers import SortedDict
>>> d = {'a': {'datetime': datetime.datetime.now()}, 'b': {'datetime': datetime.datetime.now()}, 'z': {'datetime': datetime.datetime.now()}, 'c': {'datetime': datetime.datetime.now()}}
>>> sd = SortedDict(lambda key: d[key]['datetime'], d)
>>> sd
SortedDict(<function <lambda> at 0x101e86598>, {'a': {'datetime': datetime.datetime('...')}, 'b': {'datetime': datetime.datetime('...')}, 'z': {'datetime': datetime.datetime('...')}, 'e': {'datetime': datetime.datetime('...')}})
但是,当我尝试添加新项时,会抛出关键错误异常:
>>> sd['d'] = {'datetime': datetime.datetime.now()}
>>> KeyError: 'd'
答案 0 :(得分:1)
我是sortedcontainer的新手,但我的印象是,这不可能。请查看相关的软件包Sorted Collections,尤其是ValueSortedDict。您将需要稍微重构代码,但是您可以执行以下操作:
d = {'a': {'datetime': datetime.datetime.now()}, 'b': {'datetime': datetime.datetime.now()}, 'z': {'datetime': datetime.datetime.now()}, 'c': {'datetime': datetime.datetime.now()}}
vsd = ValueSortedDict()
for k, v in d.items():
vsd[k] = v['datetime']
vsd['d'] = datetime.datetime.now()