Как установить предикат сортировки в sortedcontainers.SortedDict?

Есть ли способ сортировки предметов в 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 по значению (datetime) во время создания:

>>> 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 ответов

Я новичок в сортированных контейнерах, но у меня сложилось впечатление, что это невозможно как таковое. Вместо этого взгляните на связанный пакет 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()
Другие вопросы по тегам