Как установить предикат сортировки в sortedcontainers.SortedDict? - PullRequest
0 голосов
/ 28 мая 2018

Есть ли способ сортировки элементов в 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'

1 Ответ

0 голосов
/ 22 февраля 2019

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