nx.connected_components
Вы можете использовать networkx
для этого.Создайте график и добавьте свой список в виде ребер графика, используя add_edges_from
.Затем используйте connected_components
, который точно даст вам список наборов подключенных компонентов на графике:
import networkx as nx
L = [['John','Sayyed'], ['John' , 'Simon'] ,['bush','trump']
G=nx.Graph()
G.add_edges_from(L)
list(nx.connected_components(G))
[{'John', 'Sayyed', 'Simon'}, {'bush', 'trump'}]
Списки с несколькими элементами
В случае наличия подсписков с более чем 2
элементами, вы можете получить всю длину 2
combinations
из каждого подсписка и использовать их в качестве границ сети:
from itertools import combinations, chain
L = [['John','Sayyed'], [ 'John' , 'Simon'] ,['bush','trump'],
['Sam','Suri','NewYork'],['Suri','Orlando','Canada']]
L2_nested = [list(combinations(l,2)) for l in L]
L2 = list(chain.from_iterable(L2_nested))
#[('John', 'Sayyed'), ('John', 'Simon'), ('bush', 'trump'), ('Sam', 'Suri')...
G=nx.Graph()
G.add_edges_from(L2)
list(nx.connected_components(G))
[{'John', 'Sayyed', 'Simon'},
{'bush', 'trump'},
{'Canada', 'NewYork', 'Orlando', 'Sam', 'Suri'}]
Мы также можем визуализировать эти подключенные компоненты с помощью nx.draw
:
pos = nx.spring_layout(G, scale=20)
nx.draw(G, pos, node_color='lightblue', node_size=500, with_labels=True)
Подробности
Более подробное объяснение подключенных компонентов :
В теории графов подключенный компонент (или просто компонент) неориентированного графа - это подграф, в котором любые две вершины связаны друг с другом путями и который не связан ни с какими дополнительными вершинами в суперграфе
Таким образом, по сути, этот код создаетграфик с ребрами из списка, где каждое ребро состоит из двух значений u,v
, где u
и v
будут узлами, соединенными этим ребром.
И, следовательно, объединение подсписков с хотя бы одним подсписком с общим элементом может быть переведено в задачу теории графов как все узлы, которые достижимы между собой по существующим путям.