Существует ли тип / структура данных, которая может: содержать список чисел, может быть хэшируемой, неупорядоченной и допускает дублирование - PullRequest
1 голос
/ 25 октября 2019

Рассматривал эту разницу между кортежами и frozensets в Python и привел меня к этому вопросу для моей проблемы

По сути я хочу тип данных, который похож на кортеж, но неупорядоченный,или как морозильник, но допускает дубликаты (я понимаю, что по определению наборы не могут этого сделать, но я просто объясняю, что я хочу): хэшируемый, неупорядоченный, допускаются дубликаты.

Я пытаюсь создать набор этого типаданные для проверки различных значений, таких как (1,2,3), должны рассматриваться как такие же, как (1,3,2). Я знаю, что одним из решений было бы использовать список, заказать его, а затем сделать его кортежем, но я должен делать это много раз, и длина кортежа может быть большой, поэтому мне не придется сортировать каждый раз, если это возможно.

РЕДАКТИРОВАТЬ:

проблема немного изменилась. теперь у меня есть список кортежей, например: list_tuple = [(2, 2, 2), (2, 2, 2), (2, 1, 1)]

проблема не сильно измениласьхотя, у кортежей есть порядок, который имеет значение, но у порядка кортежей нет. так, например, это идентично предыдущему: [(2, 2, 2), (2, 1, 1), (2, 2, 2)] Я буду получать много из них, которые я хочу добавить кнабор, чтобы я мог посчитать количество различных списков кортежей. так что на самом деле у меня та же проблема, что порядок не имеет значения и допускаются дубликаты, за исключением того, что вместо целых чисел мы имеем дело с кортежами.

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

Спасибо

1 Ответ

0 голосов
/ 26 октября 2019

В зависимости от вашего варианта использования вы можете обернуть объект Counter в MappingProxyType, который предоставляет вам доступ только для чтения к базовому Counter.

>>> from collections import Counter
>>> from types import MappingProxyType
>>> d1 = MappingProxyType(Counter("aab"))
>>> d2 = MappingProxyType(Counter("aba"))
>>> d1 == d2
True

Насколько я могузнаете, нет никакого способа получить ссылку на базовые Counter объекты, чтобы вы могли изменить их.

Вам просто нужно немного поработать, чтобы перебрать дубликаты;К счастью, модуль itertools выполняет большую часть тяжелой работы.

>>> from itertools import chain, startup, repeat
>>> list(chain.from_iterable(starmap(repeat, d1.items())))
['a', 'a', 'b']
>>> list(chain.from_iterable(starmap(repeat, d2.items())))
['a', 'a', 'b']
...