2015-01-27 3 views
1

Попытка составить лучший способ объединения двух словарей. Вот код, который у меня есть. Счетчик - один из вариантов, которые я нашел.выпуск с приравнивающими словарями и глобальный выпуск

def __add__(self,right): 
     mergedbag = Bag() 
     mergedbag.bag_value = copy.copy(self.bag_value) 
     for item in right.bag_value.keys(): 
      mergedbag.bag_value[item] += right.bag_value[item] 
     return mergedbag 
+0

На всякий случай вы не знали об этом: у Python уже есть объект типа 'Bag', в виде [' collections.Counter() '] (https://docs.python.org/3/ библиотека/collections.html # collections.Counter). –

+0

@MartijnPieters - Я пробовал это, но он тоже не работал. – BoJaNgLeS

+0

Что вы подразумеваете под * не работает *? 'Counter (['d', 'a', 'b', 'd', 'c', 'b', 'd']) == Counter (['d', 'a', 'b', 'd', 'c', 'b', 'd']) 'истинно. –

ответ

3

Чтобы проверить, если два словаря имеет то же содержание, просто использовать проверку равенства:

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 и возвращать счет, как только вы правильно отслеживаете подсчеты.

+0

Я внес изменения в метод в классе, но он все еще дает True. Я думаю, это потому, что он не учитывает, что каждый элемент в словаре должен иметь то же самое значение. Словарь b и c точно такие же, как и в отношении их элементов, и их счет (тот же номер a, b, c и ds), поэтому результат должен быть правдой. Однако, поскольку счетчик не является таким же в словаре b и d (d имеет один дополнительный «a»), он должен возвращать False. – BoJaNgLeS

+0

@BoJaNgLeS: вы ничего не делаете с 'элементами' в методе' __init__', поэтому ваш 'bag_items' всегда пуст. Пустые словари всегда равны другим пустым словарям. –

+1

@BoJaNgLeS: Я сосредоточился только на вашем конкретном вопросе; исправление всего, что касается вашего элемента «Мешок», сделает мой ответ слишком длинным и подробным, но, как написано, ваша сумка требует много работы, чтобы действительно соответствовать определению типа мешка. –

Смежные вопросы