1

有没有办法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'
4

1 回答 1

1

我是 sortedcontainers 的新手,但我的印象是这是不可能的。请查看相关的包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()
于 2019-02-22T14:42:04.477 回答