Как установить предикат сортировки в 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()