Как выполнить поиск по словарю на основе элементов в списке / наборе? - PullRequest
0 голосов
/ 22 апреля 2020

Скажем, у меня есть список значений, например [1, 2, 3, 4, 5], и я сгенерировал некоторый словарный ключ на основе этих значений, поэтому, если бы у меня был другой список [5, 4, 3, 2, 1], будет генерировать тот же ключ, чтобы иметь возможность выполнять поиск в словаре с тем же значением.

a = [1, 2, 3, 4, 5]
key_1 = generate_key(a)

b = [5, 4, 3, 2, 1]
key_2 = generate_key(b)

dict = {...}
assert dict[key_1] == dict[key_2]
assert key_1 == key_2

Существуют ли алгоритмы, которые могли бы генерировать один и тот же ключ для одинаковых значений списка / набора? Список / набор может содержать строки, и в них не должно быть дубликатов.

Спасибо

1 Ответ

3 голосов
/ 22 апреля 2020

Используйте frozenset, так как дубликатов нет:

a = [1, 2, 3, 4, 5]
b = [5, 4, 3, 2, 1]

key_1 = frozenset(a)
key_2 = frozenset(b)

key_1 == key_2
# True
hash(key_1) == hash(key_2)
# True

Если были дубликаты и число случаев имело значение, вы можете использовать sorted tuple:

key_1 = tuple(sorted(a))
key_2 = tuple(sorted(b))

Оба подхода предполагают, что все значения внутри списков / наборов сами по себе являются хэшируемыми. В противном случае вам потребуется какой-то рекурсивный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...