使用Python实现图形

时间:2016-12-09 05:40:37

标签: python graph

我是python的新手,并尝试在Python中实现图形数据结构。 我已经写了这段代码,但我没有得到我想要的预期结果。 代码:

class NODE:
    def __init__(self):
        self.distance=0
        self.colournode="White"

adjlist={}

def addno(A,B):
    global adjlist
    adjlist[A]=B

S=NODE()
R=NODE()
V=NODE()
W=NODE()
T=NODE()
X=NODE()
U=NODE()
Y=NODE()

addno(S,R)

for keys in adjlist:
    print keys

我希望代码在最后一行打印{'S':R},但它打印出来:

<__main__.NODE instance at 0x00000000029E6888>

任何人都可以指导我做错了什么吗?如果我想添加另一个函数调用,如addnode(S,E),打印应该是{S:[R,E]}

2 个答案:

答案 0 :(得分:2)

您的节点需要打印标签。您不能仅使用变量名称。节点无法知道变量的名称。

class NODE:
    def __init__(self, name):
        self.name=name
    def __repr__(self):
        return self.name

adjlist={}
def addno(A,B):
    global adjlist
    adjlist[A]=B

S=NODE('S')
R=NODE('R')
addno(S,R)

print adjlist    
>>> {S: R}

但是python dict每个键只能有一个值,因此您无法同时保存{S: R}{S: V}。相反,您需要保存一组节点:

class NODE:
    def __init__(self, name):
        self.name=name
    def __repr__(self):
        return self.name

adjlist={}
def addno(A,B):
    global adjlist
    if A not in adjlist:
        adjlist[A] = []
    adjlist[A].append(B)

S=NODE('S')
R=NODE('R')
V=NODE('V')
W=NODE('W')
addno(S,R)
addno(S,V)
addno(R,W)

print adjlist
{S: [R, V], R: [W]}

作为旁注,使用不必要的全局变量是一个坏习惯。而是为图表创建一个类:

class Node:
    def __init__(self, name):
        self.name=name
    def __repr__(self):
        return self.name

class Graph:
    def __init__(self):
        self.adjlist={}
    def addno(self, a, b):
        if a not in self.adjlist:
            self.adjlist[a] = []
        self.adjlist[a].append(b)
    def __repr__(self):
        return str(self.adjlist)

G=Graph()
S=Node('S')
R=Node('R')
V=Node('V')
W=Node('W')
G.addno(S,R)
G.addno(S,V)
G.addno(R,W)

print G
>>> {R: [W], S: [R, V]}

答案 1 :(得分:0)

你得到了那个输出,因为Node是一个类的实例(你从程序输出得到的提示看到这个:<main.NODE instance at 0x00000000029E6888>)。

我认为您正在尝试为某些图算法实现adjacency list。在这些情况下,您将主要需要color和“距离to other节点”。您可以通过以下方式获得:

for keys in adjlist:
    print keys.colournode , keys.distance