Representing a network in Python

两盒软妹~` 提交于 2019-12-23 13:09:07

问题


I have a vertices such as dic = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'n':6, 'm':7, 'g':8} and i have two columns as follows represent the relationship between the vertices :

a a
b d
e f
c f
n f
m g

I want to associate each vertex in the first column with the corresponding vertex in the second column by an edge. So a with a is represent a loop. b with d is fine. e,c and n they are sharing the same vertex f. Instead to say e with f, c with f and n with f we can say e, c and n with f.


回答1:


See: https://www.python.org/doc/essays/graphs/

graph = {
    'a' : [ 'a' ],
    'b' : [ 'd' ],
    'c' : [ 'f' ],
    'd' : [],
    'e' : [ 'f' ],
    'f' : [],
    'g' : [],
    'm' : [ 'g' ],
    'n' : [ 'f' ]
}

print [ vertex for vertex, edges in graph.items() if 'f' in edges ]

EDIT:

Ok, it sounds like you just want a function to build the graph from your given inputs?

Something like this:

def build_graph( vertices, edges ):
    graph = dict( (v, list()) for v in vertices.keys() )
    for a, b in edges:
        graph[ a ].append( b )
    return graph

If you need help parsing your columnar data into a list of two-tuples then that's a different question entirely




回答2:


The general alternative to @kurosch's answer (adjacency list) is called an adjacency matrix. It's simply a matrix representing every possible edge where 1 indicates presence of an edge, 0 not.

adj = [[0 for x in range(len(dic)] for x in range(len(dic))]
adj[dic['a'][dic['b']] = 1
etc..


来源:https://stackoverflow.com/questions/6258494/representing-a-network-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!