Общее решение этой проблемы заключается в использовании multisets, которые представляют собой множества, где элемент может появляться более одного раза. Модуль collections
определяет класс Counter
, который является подклассом dict
, который реализует мультимножество. Клавиши dict
являются элементами мультимножества, а значения - это количество раз, когда клавиши появляются.
Это позволяет избежать ограничений на количество элементов в мультимножестве и уже доступно. Главный недостаток заключается в том, что нет «замороженной», хешируемой версии, о которой я знаю.
Примеры:
>>> from collections import Counter
>>> Counter((3, 6, 2, 4, 2, 8)) == Counter((8, 4, 3, 6, 2, 2))
True
>>> Counter((3, 6, 2, 4, 2, 8)) == Counter((8, 4, 3, 6, 4, 2))
False
Вы можете использовать Counter
класс непосредственно, который, вероятно, самый простой, но если вы хотите сохранить лежащую tuple
представление, вы можете использовать Counter
класс для реализации более общий вариант tuple
подкласс предложили другие:
class MultisetTuple(tuple):
def __eq__(self, other):
return Counter(self) == Counter(other)
Примеры:
>>> MultisetTuple((3, 6, 2, 4, 2, 8)) == MultisetTuple((8, 4, 3, 6, 2, 2))
True
>>> MultisetTuple((3, 6, 2, 4, 2, 8)) == MultisetTuple((8, 4, 3, 6, 4, 2))
False
Вы можете использовать 'set' или' frozenset' (hashable). –
Я reeeally новичок в python! –
Да: подкласс или сделать свой собственный простой класс. Нет: функция по умолчанию '__eq__' и' __contains__' не может быть изменена для существующих объектов tuple, это встроенная функция, привязанная к объекту класса –