从 python 中的矩阵创建邻接列表图
Creating an adjacency list graph from a matrix in python
所以我正在尝试根据字母矩阵制作字母图(以表示一个棋盘)。所以说我有这样的东西:
[ [ A, B, C, D],
[E, F, G, H],
[I, J, K, L],
[M, N, O, P] ].
我希望每个节点都是一个字母,但我无法弄清楚如何为每个节点获取邻居。例如,节点 A 将有邻居 B、E 和 F。而节点 K 将有邻居 F、G、H、J、L、M、O 和 P。任何帮助将不胜感激!
你必须使用字典来存储连接到节点的节点
:
g = { "A" : ["D", "F"],
"B" : ["C"],
"C" : ["B", "C", "D", "E"],
"D" : ["A", "C"],
"E" : ["C"],
"F" : ["D"]
}
取决于图表的结构。
要获取图中节点的邻居,您只需访问节点的值即可
>>> g["A"]
>>> ["D","F"]
假设您的矩阵是一个 n x m 矩阵,并且每个元素都是一个 unique 字符串,如下所示:
# The matrix</p>
<pre><code>matrix = [
['A', 'B', 'C', 'D'],
['E', 'F', 'G', 'H'],
['I', 'J', 'K', 'L'],
['M', 'N', 'O', 'P']
]
可以先定位到元素的索引:
node = 'K' # Input
# Get the matrix dimension
n = len(matrix)
m = len(matrix[0])
# Assume there is exactly one matching node
for i in xrange(n):
for j in xrange(m):
if matrix[i][j] == node:
x, y = i, j
然后 return 邻居列表:
# Get the (at most) 8 neighbors
neighbors = [row[max(0,y-1):y+2] for row in matrix[max(0,x-1):x+2]]
answer = set([v for r in neighbors for v in r])
answer.remove(node)
answer = list(answer)
如果节点可以多次出现,请参阅 How to find the index of a value in 2d array in Python? 如果您不熟悉 Python,这些链接也可能对您有用:
- Sub matrix of a list of lists (without numpy)
- Convert multi-dimensional list to a 1D list in Python
- How to find the index of a value in 2d array in Python?
您可以遍历矩阵中的每个节点,然后将右侧和下方的每个相邻节点添加到结果中:
matrix = [
['A', 'B', 'C', 'D'],
['E', 'F', 'G', 'H'],
['I', 'J', 'K', 'L'],
['M', 'N', 'O', 'P']
]
def add(adj_list, a, b):
adj_list.setdefault(a, []).append(b)
adj_list.setdefault(b, []).append(a)
adj_list = {}
for i in range(len(matrix)):
for j in range(len(matrix[i])):
if j < len(matrix[i]) - 1:
add(adj_list, matrix[i][j], matrix[i][j+1])
if i < len(matrix[i]) - 1:
for x in range(max(0, j - 1), min(len(matrix[i+1]), j+2)):
add(adj_list, matrix[i][j], matrix[i+1][x])
import pprint
pprint.pprint(adj_list)
输出:
{'A': ['B', 'E', 'F'],
'B': ['A', 'C', 'E', 'F', 'G'],
'C': ['B', 'D', 'F', 'G', 'H'],
'D': ['C', 'G', 'H'],
'E': ['A', 'B', 'F', 'I', 'J'],
'F': ['A', 'B', 'C', 'E', 'G', 'I', 'J', 'K'],
'G': ['B', 'C', 'D', 'F', 'H', 'J', 'K', 'L'],
'H': ['C', 'D', 'G', 'K', 'L'],
'I': ['E', 'F', 'J', 'M', 'N'],
'J': ['E', 'F', 'G', 'I', 'K', 'M', 'N', 'O'],
'K': ['F', 'G', 'H', 'J', 'L', 'N', 'O', 'P'],
'L': ['G', 'H', 'K', 'O', 'P'],
'M': ['I', 'J', 'N'],
'N': ['I', 'J', 'K', 'M', 'O'],
'O': ['J', 'K', 'L', 'N', 'P'],
'P': ['K', 'L', 'O']}
所以我正在尝试根据字母矩阵制作字母图(以表示一个棋盘)。所以说我有这样的东西:
[ [ A, B, C, D],
[E, F, G, H],
[I, J, K, L],
[M, N, O, P] ].
我希望每个节点都是一个字母,但我无法弄清楚如何为每个节点获取邻居。例如,节点 A 将有邻居 B、E 和 F。而节点 K 将有邻居 F、G、H、J、L、M、O 和 P。任何帮助将不胜感激!
你必须使用字典来存储连接到节点的节点 :
g = { "A" : ["D", "F"],
"B" : ["C"],
"C" : ["B", "C", "D", "E"],
"D" : ["A", "C"],
"E" : ["C"],
"F" : ["D"]
}
取决于图表的结构。
要获取图中节点的邻居,您只需访问节点的值即可
>>> g["A"]
>>> ["D","F"]
假设您的矩阵是一个 n x m 矩阵,并且每个元素都是一个 unique 字符串,如下所示:
# The matrix</p>
<pre><code>matrix = [
['A', 'B', 'C', 'D'],
['E', 'F', 'G', 'H'],
['I', 'J', 'K', 'L'],
['M', 'N', 'O', 'P']
]
可以先定位到元素的索引:
node = 'K' # Input
# Get the matrix dimension
n = len(matrix)
m = len(matrix[0])
# Assume there is exactly one matching node
for i in xrange(n):
for j in xrange(m):
if matrix[i][j] == node:
x, y = i, j
然后 return 邻居列表:
# Get the (at most) 8 neighbors neighbors = [row[max(0,y-1):y+2] for row in matrix[max(0,x-1):x+2]] answer = set([v for r in neighbors for v in r]) answer.remove(node) answer = list(answer)
如果节点可以多次出现,请参阅 How to find the index of a value in 2d array in Python? 如果您不熟悉 Python,这些链接也可能对您有用:
- Sub matrix of a list of lists (without numpy)
- Convert multi-dimensional list to a 1D list in Python
- How to find the index of a value in 2d array in Python?
您可以遍历矩阵中的每个节点,然后将右侧和下方的每个相邻节点添加到结果中:
matrix = [
['A', 'B', 'C', 'D'],
['E', 'F', 'G', 'H'],
['I', 'J', 'K', 'L'],
['M', 'N', 'O', 'P']
]
def add(adj_list, a, b):
adj_list.setdefault(a, []).append(b)
adj_list.setdefault(b, []).append(a)
adj_list = {}
for i in range(len(matrix)):
for j in range(len(matrix[i])):
if j < len(matrix[i]) - 1:
add(adj_list, matrix[i][j], matrix[i][j+1])
if i < len(matrix[i]) - 1:
for x in range(max(0, j - 1), min(len(matrix[i+1]), j+2)):
add(adj_list, matrix[i][j], matrix[i+1][x])
import pprint
pprint.pprint(adj_list)
输出:
{'A': ['B', 'E', 'F'],
'B': ['A', 'C', 'E', 'F', 'G'],
'C': ['B', 'D', 'F', 'G', 'H'],
'D': ['C', 'G', 'H'],
'E': ['A', 'B', 'F', 'I', 'J'],
'F': ['A', 'B', 'C', 'E', 'G', 'I', 'J', 'K'],
'G': ['B', 'C', 'D', 'F', 'H', 'J', 'K', 'L'],
'H': ['C', 'D', 'G', 'K', 'L'],
'I': ['E', 'F', 'J', 'M', 'N'],
'J': ['E', 'F', 'G', 'I', 'K', 'M', 'N', 'O'],
'K': ['F', 'G', 'H', 'J', 'L', 'N', 'O', 'P'],
'L': ['G', 'H', 'K', 'O', 'P'],
'M': ['I', 'J', 'N'],
'N': ['I', 'J', 'K', 'M', 'O'],
'O': ['J', 'K', 'L', 'N', 'P'],
'P': ['K', 'L', 'O']}