在Python中实现没有库的图形

在Python中实现没有库的图形,python,graph,directed-graph,undirected-graph,Python,Graph,Directed Graph,Undirected Graph,我是Python新手,尝试在不使用库的情况下构建有向图。有人能确认我是否正确理解这个例子吗 from collections import defaultdict class Graph: def __init__(graph): graph.dict = defaultdict(list) def add(graph,node,adjacent_node): graph.dict[node].append(adjacent_node)

我是Python新手,尝试在不使用库的情况下构建有向图。有人能确认我是否正确理解这个例子吗

from collections import defaultdict 
class Graph:
    def __init__(graph):
        graph.dict = defaultdict(list)
    def add(graph,node,adjacent_node): 
        graph.dict[node].append(adjacent_node)    #line 6
        graph.dict[adjacent_node].append(node)    #line 7

graph = Graph()
graph.add('1','2') 
graph.add('2','5') 
graph.add('2','3') 
graph.add('4','5') 
graph.add('4','3') 
graph.add('6','4') 
graph.add('6','5')
print('Dictionary:',graph.dict)

_____
Output:
Dictionary: defaultdict(<class 'list'>, {'1': ['2'], '2': ['1', '5', '3'], '5': ['2', '4', '6'], '3': ['2', '4'], '4': ['5', '3', '6'], '6': ['4', '5']})
从集合导入defaultdict
类图:
定义初始化(图形):
graph.dict=defaultdict(列表)
def add(图形、节点、相邻_节点):
graph.dict[node].append(相邻的_节点)#第6行
graph.dict[相邻节点].追加(节点)#第7行
图=图()
添加('1','2')
图.add('2','5')
图形添加('2','3')
图.add('4','5')
添加('4','3')
图形添加('6','4')
图形添加('6','5')
打印('Dictionary:',graph.dict)
_____
输出:
字典:defaultdict(,{'1':['2'],'2':['1','5','3'],'5':['2','4'],'3':['2','4'],'4':['5','3','6'],'6':['4','5'])
据我所知,这个例子是建立一个无向图

  • 在第6行,他们正在添加从原始节点到相邻节点的路径
  • 在第7行,他们正在添加从相邻节点到原始节点的路径
这是正确的吗

而且我有点困惑,如果这些是节点,为什么它们需要到下一个节点的路径?一旦我创建了一个addEdges函数,边不就可以解决这个问题了吗?或者这个函数可以同时添加节点和边吗

此处使用的是图形表示

在当前实现中,
add
创建从
节点到
相邻节点的无向边。“无向边”是指如果你在
节点
,你可以转换到
相邻节点
,如果你在
相邻节点
,你可以转换到
节点
。这是一种双向关系

add
如果由于
defaultdict
而不存在这些节点,也会创建这些节点。将节点视为dict中的键,将边视为与节点关联的列表中的元素

如果需要有向图,这意味着
add
应该只创建一条从源到目标的边:

def add(graph,node,adjacent_node): 
    graph.dict[node].append(adjacent_node)
    # graph.dict[adjacent_node].append(node)  # <- skip if you want a directed graph
def添加(图形、节点、相邻节点):
graph.dict[node].append(相邻的_节点)

#graph.dict[相邻节点].append(节点)#直到最后一段,您的理解都是正确的<代码>添加
已添加边,如果节点不存在,则添加节点。如果你想要一个有向图(有向图),去掉第7行。明白了谢谢@ggorlenThank,你的解释清楚了很多。我指的是一个项目的例子,我正在工作,数据是无序的,所以我认为这将工作。会做的,谢谢!另外,对于有向图,使用邻接矩阵是更好的方法吗?您引用的wiki页面提到它是邻接列表的替代品。有许多方法表示图形,并且它依赖于应用程序,因此在所有用例中,对于定向图形来说,客观上两者都不是更好的。看见