Как правильно использовать SortedSets по ключу в Python sortedcontainers - PullRequest
0 голосов
/ 07 мая 2018

SortedListWithKey может отсортировать список с помощью лямбда-функции:

from sortedcontainers import SortedListWithKey

SortedListWithKey([[4, 'last'], [1, 'first']], key=lambda x: x[0])
# Result: SortedListWithKey([[1, 'first'], [4, 'last']], key=<function <lambda> at 0x107f5d730>)

Но, скажем, мне нужно использовать set () , чтобы иметь только уникальные значения, в документации сказано, что он также принимает параметр key = для сортировки пользовательской функцией, но я не могу заставить ее работать:

from sortedcontainers import SortedSet

SortedSet([[4, 'last'], [1, 'first']], key=lambda x: x[0])

сгенерирует следующее исключение:

values = set(chain(*iterables))
TypeError: unhashable type: 'list'

Есть ли способ достичь этого?

1 Ответ

0 голосов
/ 08 мая 2018

Сортированный набор требует, чтобы элементы были хэшируемыми. Ваши элементы - это списки, которые не поддерживают хеширование. Измените элементы на кортежи, и это будет работать:

>>> from sortedcontainers import SortedSet
>>> ss = SortedSet([(4, 'last'), (1, 'first')], key=lambda value: value[0])
>>> ss
SortedSet([(1, 'first'), (4, 'last')], key=<function <lambda> at 0x10fff4848>)

Этот отсортированный набор упорядочит элементы по первому индексу в паре. Преимущество кортежей в том, что они хэшируемы, недостаток в том, что они неизменны.

Попробуйте использовать sortedcontainers.SortedDict вместо:

>>> sd = SortedDict({4: 'last', 1: 'first'})
>>> sd
SortedDict({1: 'first', 4: 'last'})
>>> sd[2] = 'second'
>>> sd.pop(4)
'last'

Сортированный dict сохранит ключи в отсортированном порядке и позволит вам обновлять значения в соответствии с вашими предпочтениями.

...