如何将相邻节点列表转换为图形(邻接列表)

How to convert list of adjacent nodes into a graph (adjacency list)

提问人:Abby 提问时间:11/7/2023 更新时间:11/7/2023 访问量:41

问:

我有一个文本文件,其中包含无向图中的所有连接,如下所示:

N_0, N_2
N_5, N_3
N_3, N_2

等等。使用此文本文件,我想生成一个图形以在其上运行 DFS。

这是我的思考过程:

我将文件转换为二维数组,找出有多少个元素,并使用此信息创建邻接列表。

这就是我到目前为止所拥有的

fileName = input("Enter text file name: ")

# Create 2D array of connected nodes
with open(fileName, "r") as file:
    data = [[str(x) for x in line.replace('\n', '').split(",")] for line in file]

#Create list of unique nodes and sort them
nodeList = list(set(i for j in data for i in j))
nodeList.sort(key=lambda x: int(x[x.find('_') + 1:]))

adjacencyList = dict(nodeList)

我被困在如何进行上。我无法将 nodeList 转换为字典,并且在转换之后,我不确定如何将连接加载到其中。我想只是遍历数据并在字典上标记所有连接?

非常感谢有关如何进行的任何建议。

Python 列表 排序

评论

1赞 Andrej Kesely 11/7/2023
你能用模块吗?networkx
0赞 Tim Roberts 11/7/2023
你最终会得到一个字典,其中节点名称是键,值是字符串列表。您不需要生成或排序节点列表 - 您可以从之后的 dict 键中获取它。
0赞 Abby 11/7/2023
我可以使用 networkx,只是我以前从未使用过它

答:

0赞 Tim Roberts 11/7/2023 #1

只需在读取文件时创建邻接字典即可。您可以通过从该字典中获取密钥来获取节点列表。

from collections import defaultdict

# Create 2D array of connected nodes
nodes = defaultdict(list)
for line in open('x.txt'):
    a,b = line.rstrip().split(', ')
    nodes[a].append( b )
    nodes[b].append( a )

print(nodes)
print(list(nodes.keys()))

输出:

defaultdict(<class 'list'>, {'N_0': ['N_2'], 'N_2': ['N_0', 'N_3'], 'N_5': ['N_3'], 'N_3': ['N_5', 'N_2']})
['N_0', 'N_2', 'N_5', 'N_3']

但是,使用的建议仍然是最好的计划networkx

评论

0赞 Abby 11/7/2023
谢谢!这种方法对我有用。它比我所做的要简单得多,哈哈
0赞 Abby 11/7/2023
有没有办法对新字典进行排序,使其为 { N_0: [N_2], N_2: [N_0, N_3], N_3: [N_2] 等等?
0赞 Tim Roberts 11/7/2023
是的,如果它不是有向图,那么你只需更改循环以在两个方向上输入,a->b 和 b->a。