2015-01-26 72 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']))'' – 2015-01-26 20:33:48

+0

'Bag ['a','b]'缺少''''' Bag ['a','b']'。如果之后仍然有错误,这将有助于您发布完整的追溯以及更多'Bag'类。 – lvc 2015-01-26 20:44:31

+0

@Ivc - 刚刚发布的课程 – BoJaNgLeS 2015-01-26 20:50:56

回答

0

首先,重要的是要注意你的Bag类基本上和Counter相同。如果你需要任何特定的扩展名,只需从它继承,你就完成了。我要说的是,下面的代码只是解决所有的功能要实现自己在你的袋类:

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) 

如果你正在做一个锻炼学习,问题是,你是不是实现setitemgetitem方法在您的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 

确保创建并返回一个对象袋

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 2015-01-27 18:08:56

+0

@BoJaNgLeS,嗨,正如我在答案中所解释的,“dict1 + dict2”不起作用。你必须迭代每个键并创建一个新的合并字典。我已经在上面添加了一些代码。 – st0le 2015-01-28 07:41:46

+0

@ st0le-我试过了,它给了我一个对象而不是可下载的错误。我更新了代码。 – BoJaNgLeS 2015-01-29 19:51:59