2016-09-08 74 views
1

我正試圖實現以下結構。添加多個元素以在字典中設置

{0: set([1]), 1: set([2]), 2: set([0,3]), 3: set([3])} 

以下是我的代碼:

class Graph(object): 
    """ This is the graph class which will store the information regarding 
     the graph like vertices and edges. 
    """ 

    def __init__(self,num_vertices): 
     self.vertices = num_vertices 
     self.edges = [] 
     self.indi_edges =() 

    def enter_edges(self,source,dest): 
     self.indi_edges = (source, dest) 
     self.edges.append(self.indi_edges) 

    def form_graph_structure(self): 
     temp_dict = {} 
     for idx,value in enumerate(self.edges): 
      if value[0] in temp_dict: 
       print "here" 
       temp_dict[value[0]].update(value[1]) 
      print "there" 
      temp_dict[value[0]] = set() 
      temp_dict[value[0]].add(value[1]) 
     print temp_dict 


    def display(self): 
     print self.edges 

g = Graph(4) 
g.enter_edges(2,0) 
g.enter_edges(2,3) 
g.enter_edges(0,1) 
g.enter_edges(1,2) 
g.enter_edges(3,3) 
g.form_graph_structure() 

我收到以下錯誤

File "DFS.py", line 20, in form_graph_structure 
    temp_dict[value[0]].update(value[1]) 
TypeError: 'int' object is not iterable 

誰能幫助?

回答

1

可以使用set使用defaultdict作爲其默認值。

from collections import defaultdict 

class Graph(object): 
    """ This is the graph class which will store the information regarding 
     the graph like vertices and edges. 
    """ 

    def __init__(self, num_vertices): 
     self.vertices = num_vertices 
     self.edges = [] 

    def enter_edges(self, source, dest): 
     self.edges.extend([(source, dest)]) 

    def form_graph_structure(self): 
     temp_dict = defaultdict(set) 
     for pair in self.edges: 
      source, dest = pair 
      temp_dict[source].add(dest) 
     print temp_dict 

    def display(self): 
     print dict(self.edges) 

g = Graph(4) 
g.enter_edges(2,0) 
g.enter_edges(2,3) 
g.enter_edges(0,1) 
g.enter_edges(1,2) 
g.enter_edges(3,3) 

>>> g.form_graph_structure() 
{0: set([1]), 1: set([2]), 2: set([0, 3]), 3: set([3])} 

你也可以輸入每個對邊緣的後更新圖結構:

class Graph(object): 
    """ This is the graph class which will store the information regarding 
     the graph like vertices and edges. 
    """ 

    def __init__(self): 
     self.graph = defaultdict(set) 

    def enter_edges(self, source, dest): 
     self.graph[source].add(dest) 

    def display(self): 
     print dict(self.graph) 

g = Graph() 
edges = [(2, 0), (2, 3), (0, 1), (1, 2), (3, 3)] 
for pair in edges: 
    g.enter_edges(*pair) 
g.display() 
{0: set([1]), 1: set([2]), 2: set([0, 3]), 3: set([3])} 
3

set.update()預計值可迭代值。使用set.add()添加一個值:每次

if value[0] in temp_dict: 
    temp_dict[value[0]].add(value[1]) 

而不是測試value[0],使用dict.setdefault()設置空集,如果密鑰丟失:

def form_graph_structure(self): 
    temp_dict = {} 
    for source, dest in self.edges: 
     temp_dict.setdefault(source, set()).add(dest) 
    return temp_dict