Чтобы проверить, если два словаря имеет то же содержание, просто использовать проверку равенства:
self.bag_items == bag_equal.bag_items
Python делает этот тест сравнения эффективно; ключи и значения должны точно соответствовать и разница в длине означает, что словари не равны:
>>> a = {'a': 'b'}
>>> b = {'a': 'b'}
>>> a == b
True
>>> b['b'] = 'c'
>>> a == b
False
>>> del b['b']
>>> b['a'] = 'c'
>>> a == b
False
>>> b['a'] = 'b'
>>> a == b
True
Обратите внимание, что вместо того, приподнять TypeError
, __eq__
должен возвращать объект NotImplemented
дозорного сигнализировать, что тестирование равенства не поддерживается:
def __eq__(self, other):
if not isinstance(other, Bag):
return NotImplemented
return self.bag_items == other.bag_items
в качестве побочного отметить, оператор in
членства уже возвращает либо True
или False
, нет необходимости использовать условное выражение в __contains__
; следующее достаточно:
def __contains__(self, include):
return include in self.bag_items
Ваш код никогда фактически ничего не делает с items
прошло в однако, ни вы никогда не считать предметы. Ваш метод count()
должен просто искать элемент в self.bag_items
и возвращать счет, как только вы правильно отслеживаете подсчеты.
На всякий случай вы не знали об этом: у Python уже есть объект типа 'Bag', в виде [' collections.Counter() '] (https://docs.python.org/3/ библиотека/collections.html # collections.Counter). –
@MartijnPieters - Я пробовал это, но он тоже не работал. – BoJaNgLeS
Что вы подразумеваете под * не работает *? 'Counter (['d', 'a', 'b', 'd', 'c', 'b', 'd']) == Counter (['d', 'a', 'b', 'd', 'c', 'b', 'd']) 'истинно. –