我是Python(以及计算机科学)的新手,所以请耐心等待。
我在Python中实现邻接列表时遇到了麻烦。我已经学会了如何通过字典实现它(我在这里学到了如何通过lol),但我需要知道如何只使用基本列表(列表列表)
这是我的代码:
with open("graph1.txt") as infile:
vertices = []
for line in infile:
line = line.split()
line = [int(i) for i in line]
vertices.append(line)
adj = dict()
for edge in vertices:
x, y = int(edge[0]), int(edge[1])
if x not in adj: adj[x] = set()
if y not in adj: adj[y] = set()
adj[x].add(y)
adj[y].add(x)
print(adj)
感谢任何帮助。 干杯
答案 0 :(得分:0)
你仍然会考虑一组顶点,每个顶点都有一组相邻的顶点,但是你将把这些集合实现为列表而不是更复杂的set
数据结构。您将需要一种快速索引到顶级集合的方法,唯一的方法是使用整数索引。因此,您希望为每个顶点分配一个(自然或任意)整数k,然后将该顶点的邻接集(实现为列表)放入顶级列表的插槽k中。提供对二级列表的有效索引并不重要,因为您通常会迭代它们而不是选择特定的列表,但由于Python有一个内置列表,恰好提供了有效的整数索引,为什么不使用它?
我同意评论称vertices
变量不应该保留边缘。世界上的每个人,但你会感到困惑,后来你也会感到困惑。我建议你使用名称vertices
作为我上面描述的顶级列表。然后,第二级列表可以将索引保存到顶级vertices
。 (好吧,也许你也需要边缘对象 - 我不知道你使用的是什么 - 但纯粹主义者的邻接列表表示没有边缘对象的空间。)
答案 1 :(得分:0)
我不确定你是否得到它,但无论如何这里是我的邻接列表的python实现。我使用了列表清单。 Python 2 代码:
class graph(object):
def __init__(self, n):
self.n=n
self.mat=[list() for i in range(n)]
def insert(self, u, v, w):
t=[v, w]
self.mat[u].append(t)
def printGraph(self):
i=0
for i in range(self.n):
print i, self.mat[i]
def deleteEdge(self, u, v):
weight=0
for x in self.mat[u]:
if x[0]==v:
weight=x[1]
break
self.mat[u].remove([v, weight])
g=graph(3) # 3 is the number of vertices
g.insert(0, 1, 10) # 10 is the weight of the edge
g.insert(0, 2, 12)
g.insert(1, 2, 9)
g.printGraph()
g.deleteEdge(0, 1)
g.printGraph()