如何在sortedcontainers.SortedDict中设置排序谓词?

时间:2018-05-27 22:49:44

标签: python algorithm data-structures collections sortedcontainers

有没有办法按值对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'

1 个答案:

答案 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()