Я пытаюсь создать объединение двух словарей по умолчанию. Вот код метода в моем классе:
def __add__(self,right):
mergedbag = copy.copy(self.bag_value)
for item in right:
if item not in mergedbag:mergedbag[item] = 0
mergedbag[item] += right[item]
return mergedbag
Я создаю два словаря по умолчанию:
b = Bag(['d','a','b','d','c','b','d'])
c = Bag(['d','a','b','d','c','b','d'])
результат
print(b+c)
должно быть общее количество элементов после объединения..
Bag(a[a],b[4],c[3],d[6])
Это ошибка, которую я продолжаю получать:
Traceback (most recent call last):
File "D:\workspace33\courselib\driver.py", line 229, in driver
Command[print(b+c)]: exec(old,local,globl)
File "<string>", line 1, in <module>
File "D:\workspace33\Project2\src\bag.py", line 58, in __add__
mergedbag[item] += right[item]
TypeError: 'Bag' object is not subscriptable
Вот новый код:
class Bag:
def __init__(self, items = []):
self.bag_value = defaultdict(int)
for item in items:
self.bag_value[item] += 1
def __repr__(self):
bag_list = []
for item, count in self.bag_value.items():
bag_list.extend(list(item*count))
return 'Bag(' + str(bag_list) + ')'
def __str__(self):
return 'Bag(' + ','.join(str(item) + '[' + str(count) + ']' for item, count in self.bag_value.items()) + ')'
def __len__(self):
bag_len = 0
for value in self.bag_value:
bag_len += self.bag_value[value]
return bag_len
def unique(self):
return len(self.bag_value)
def __contains__(self, item):
return item in self.bag_value
def count(self, item):
return(self.bag_items.count(item))
def add(self, new):
self.bag_value[new] += 1
def __add__(self,right):
mergedbag = copy.copy(self.bag_value)
for item in right:
if item not in mergedbag:mergedbag[item] = 0
mergedbag[item] += right[item]
return mergedbag
def remove(self, item):
if item in self.bag_items:
del(item)
else:
raise ValueError(type_as_str(item) + ' not in bag.')
def __eq__(self, right):
if type(right) is not Bag:
raise TypeError('Cannot compare Bag with' + type_as_str(right) + '. Can only compare Bag with Bag')
else:
return (len(self) == len(right)) and (self.unique() == right.unique())
def __ne__(self, right):
return not self.__eq__(right)
def _bag_gen(self, bag_value):
for item in self.bag_value:
for count in range(self.bag_value[item]):
yield item
def __iter__(self):
return self._bag_gen(self.bag_value)
if __name__ == '__main__':
# bag = Bag(['d','a','b','d','c','b','d'])
# bag2 = Bag(['d','a','b','d','c','b','d'])
# bag3 = Bag(['d','a','b','d','c','b'])
# print(bag == bag2)
# print(bag == bag3)
# print(bag != bag2)
# print(bag != bag3)
import driver
driver.driver()
Bag
и что вы подразумеваете подIs there a way to make the method accept command str(Bag(['a','b] + Bag(['b','c']))
? - person Jon Clements♦   schedule 26.01.2015Bag['a', 'b]
отсутствует'
-Bag['a', 'b']
. Если после этого все еще возникает ошибка, было бы полезно, если бы вы могли опубликовать полную трассировку, а также больше вашего классаBag
. - person lvc   schedule 26.01.2015dict.items
больше не создает список. Кроме того, вы не можете наследоватьdefaultdict(it)
, толькоdefaultdict
. Но вы можете получить тот же эффект, унаследовав dict и определив__missing__
для возврата 0, что и делаетcollections.Counter
. - person lvc   schedule 27.01.2015__init__
, чтобы выполнить назначение для bag_items. - person BoJaNgLeS   schedule 28.01.2015