Search code examples
python-2.7graphpycharmattributeerror

AttributeError: 'dict' object has no attribute (...) when iterate over a dictionary of sets


I'm trying to remove a node from an undirected graph represented by his adjacency list but I'm receiving an error that I can't understand.

Example of a ugraph:

g1 = {0: set([1]), 1: set([0, 2]), 2: set([1, 3]), 3: set([2]), 4: {5, 6}, 5: {4}, 6: {}}

Function that I'm creating:

def remove_node(ugraph, node):
    """
    :param ugraph: An undirected graph
    :param node: The node that we want to remove
    :return: The undirected graph minus one node :)
    """

    try:
        del ugraph[node]
    except KeyError:
        print "The node is not in the graph" 

    for key in ugraph.keys():
        ugraph[key] = ugraph[key].difference(set([node]))

    return ugraph

And this is my error:

Traceback (most recent call last):
  File "/home/juan/PycharmProjects/AlgorithmicThinking_week2/resilence.py", line 46, in <module>
    print remove_node(g1, 1)
  File "/home/juan/PycharmProjects/AlgorithmicThinking_week2/resilence.py", line 42, in remove_node
    ugraph[key] = ugraph[key].difference(set([node]))
AttributeError: 'dict' object has no attribute 'difference'

Why is this happening?


Solution

  • One of these things is not like the other:

    >>> g1 = {0: set([1]), 1: set([0, 2]), 2: set([1, 3]), 3: set([2]), 4: {5, 6}, 5: {4}, 6: {}}
    >>> for key in g1: 
    ...     print key, g1[key], type(g1[key])
    ...
    0 set([1]) <type 'set'>
    1 set([0, 2]) <type 'set'>
    2 set([1, 3]) <type 'set'>
    3 set([2]) <type 'set'>
    4 set([5, 6]) <type 'set'>
    5 set([4]) <type 'set'>
    6 {} <type 'dict'>
    

    {} is an empty dict, not the empty set. Use set() instead.