Пожалуйста, смотрите часть под РЕДАКТИРОВАТЬ!
Я думаю, что другие варианты более общие и, вероятно, более приятные с программной точки зрения. Я только что быстро понял, как вы можете получить список очень простым способом, используя numpy.
Сначала создайте матрицу смежности, и ваш список узлов будет массивом:
import numpy as np
node_list= np.random.randint(10 , size=(10, 2))
A = np.zeros((np.max(node_list) + 1, np.max(node_list) + 1)) # + 1 to account for zero indexing
A[node_list[:, 0], node_list[:, 1]] = 1 # set connected nodes to 1
x, y = np.where(A == 0) # Find disconnected nodes
disconnected_list = np.vstack([x, y]).T # The final list of disconnected nodes
Я понятия не имею, как это будет работать с действительно крупномасштабными сетями.
РЕДАКТИРОВАТЬ: Приведенное выше решение заставило меня задуматься слишком быстро. На данный момент решение выше обеспечивает пропущенные ребра между узлами, а не разъединенные узлы (в случае ориентированного графа). Кроме того, disconnected_list включает каждый узел дважды. Вот еще одна хакерская идея решения:
import numpy as np
node_list= np.random.randint(10 , size=(10, 2))
A = np.zeros((np.max(node_list) + 1, np.max(node_list) + 1)) # + 1 to account for zero indexing
A[node_list[:, 0], node_list[:, 1]] = 1 # set connected nodes to 1
A[node_list[:, 1], node_list[:, 0]] = 1 # Make the graph symmetric
A = A + np.triu(np.ones(A.shape)) # Add ones to the upper triangular
# matrix, so they are not considered in np.where (set k if you want to consider the diagonal)
x, y = np.where(A == 0) # Find disconnected nodes
disconnected_list = np.vstack([x, y]).T # The final list of disconnected nodes