2015-01-26 3 views
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 

Я создаю два по умолчанию словарей:

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() 
+2

Что такое 'Bag' и что вы имеете в виду' Есть ли способ, чтобы сделать метод принять команду str (Bag (['a', 'b] + Bag ([' b ',' c '])) '? –

+0

' Bag [' a ',' b] 'отсутствует' '' - ' Bag ['a', 'b'] '. Если после этого по-прежнему появляется ошибка, это поможет, если вы сможете опубликовать полную трассировку, а также больше своего класса' Bag'. – lvc

+0

@Ivc - только что опубликовал класс – BoJaNgLeS

ответ

0

Прежде всего, важно отметить, что ваш класс Bag в основном такой же, как и счетчик. Если вам нужно какое-то конкретное расширение, просто наследуйте его, и вы закончите. Я бы сказал, что следующий код просто решить все функциональные возможности вы реализуете себя в классе Bag:

from collections import Counter 

class Bag(Counter): 
    pass 

b = Bag(['d','a','b','d','c','b','d']) 
c = Bag(['d','a','b','d','c','b','d']) 

print (b) 
print (c) 
print (b+c) 

Если вы делаете упражнения, чтобы узнать, проблема заключается в том, что вы не выполняете SetItem и getitem методов в вашем классе Bag, чтобы разрешить обозначение []. Вы могли бы реализовать их или просто получить доступ к атрибут bag_value:

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 

Будьте уверены, чтобы создать и вернуть объект Bag

0

Это определение

def __add__(self,other):

Таким образом, вы должны объединить содержимое self.items с other.items, а затем верните результат.

Кроме того, не уверен, что bag1+bag2 будет работать, но мой pyfu слаб, вам явно придется проходить через них и добавлять отсчеты вместе.

import copy 

c = {'a':2,'b':1} 
d = {'b':1,'c':1} 

# 
mergedBag = copy.copy(c) #might wanna use deepcopy? 
for k in d: 
    if k not in mergedBag: mergedBag[k] = 0 
    mergedBag[k] += d[k] 

print mergedBag 
+0

@ st0le..Я обновил вопрос. Извини за это. – BoJaNgLeS

+0

@BoJaNgLeS, Привет, Как объясняется в моем ответе 'dict1 + dict2' не будет работать. Вам придется перебирать каждый ключ и создавать новый объединенный dict. Я добавил код выше. – st0le

+0

@ st0le- Я пробовал это, и он дает мне объект, не подлежащий индексируемой ошибке. Я обновил код. – BoJaNgLeS

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