Search code examples
python-3.xequalitydefaultdict

issue with equating dictionaries and global issue


Trying to figure best way to union of two dictionaries. Here is the code that I have. Counter is one of the options that I found.

    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

Solution

  • To test if two dictionaries have the same contents, simply use an equality test:

    self.bag_items == bag_equal.bag_items
    

    Python does this comparison test efficiently; keys and values have to match exactly and difference in length means the dictionaries are not equal:

    >>> 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
    

    Note that rather than raise a TypeError, __eq__ should return the NotImplemented sentinel object to signal that equality testing is not supported:

    def __eq__(self, other):
        if not isinstance(other, Bag):
            return NotImplemented
       return self.bag_items == other.bag_items
    

    As a side-note, the in membership operator already returns either True or False, there is no need to use a conditional expression in __contains__; the following is enough:

    def __contains__(self, include):
        return include in self.bag_items
    

    Your code never actually does anything with the items passed in however, nor are you ever counting the items. Your count() method should just look up the element in self.bag_items and return the count once you properly track counts.