2015-01-26 5 views
1

두 개의 기본 사전으로 구성하려고합니다.기본 사전 두 개를 조합하여

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

print(b+c) 

의 결과가 이후 요소의 총 수 있어야한다 :

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 

내가 두 개의 기본 사전을 만들 : 여기 내 클래스의 메서드에 대한 코드입니다 노조 ..

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 [ 'a', 'b] + Bag (['b ','c ']))'? –

+0

'Bag ['a ','b] Bag [ 'a', 'b']'. 그 후에도 오류가 계속되면, 전체 추적뿐만 아니라 더 많은 'Bag' 클래스를 게시 할 수 있다면 도움이 될 것입니다 .. – lvc

+0

@Ivc - 방금 클래스를 게시했습니다. – BoJaNgLeS

답변

0

먼저 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을 구현하지 않는 것입니다 Bag 클래스의 getitem 메소드를 사용하여 [] 표기법을 허용하십시오. 당신이 그들을 구현하거나 속성 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'는 설명대로 작동하지 않습니다. 각 키를 반복하고 새 병합 된 사전을 만들어야합니다. 위 코드를 추가했습니다. – st0le

+0

@ st0le- 나는 그것을 시도하고 subscriptable 오류가 아니라 개체를 제공합니다. 코드를 업데이트했습니다. – BoJaNgLeS