Союз сублистов с общими элементами

Как мы можем объединить два списка в основной список, которые имеют какой-либо общий элемент?

Например, у меня есть список списков, и два из списков говорят, что list1 = [John, Sayyed] и list2 = [John, Simon] есть, поэтому я хочу, чтобы list1 и list2 слились и стали одним списком без повторяющегося элемента. Все остальные списки. элементы не должны быть затронуты.

L = [[John,Sayyed], [ John , Simon] ,[bush,trump],[Sam,Suri,NewYork],[Suri,Orlando,Canada]]

Мне нужен мой вывод как

[[John,Sayyed,Simon] ,[bush,trump],[Sam,Suri,NewYork,Orlando,Canada]]

Может ли кто-нибудь поделиться своими ценными мыслями?

+4
21 дек. '18 в 14:05
источник поделиться
5 ответов

Вы можете использовать networkx для этого. Создайте график и добавьте свой список в виде ребер графа, используя add_edges_from. Затем используйте connected_components, который точно даст вам список наборов связанных компонентов на графике:

import networkx as nx 

G=nx.Graph()
G.add_edges_from(L)
list(nx.connected_components(G))

[{'John', 'Sayyed', 'Simon'}, {'bush', 'trump'}]

Обновить

В случае наличия подсписков с более чем 2 элементами вы можете получить все combinations длины 2 из каждого подсписка и использовать их в качестве ребер сети:

from itertools import combinations, chain

L = [['John','Sayyed'], [ 'John' , 'Simon'] ,['bush','trump'],
     ['Sam','Suri','NewYork'],['Suri','Orlando','Canada']]

L2 = list(chain.from_iterable([list(combinations(l,2)) for l in L]))
#[('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'}]

Более подробное объяснение по подключенным компонентам:

В теории графов связный компонент (или просто компонент) неориентированного графа является подграфом, в котором любые две вершины соединены друг с другом путями и который не связан ни с какими дополнительными вершинами в суперграфе.

По сути, этот код создает граф с ребрами из списка, где каждое ребро состоит из двух значений u,v где u и v будут узлами, соединенными этим ребром.

И, следовательно, объединение подсписков по крайней мере с одним подсписком с общим элементом может быть переведено в задачу теории графов как все узлы, которые достижимы между собой по существующим путям. Пример этого можно увидеть на следующем графике, который имеет три связанных компонента:

enter image description here

+6
21 дек. '18 в 14:09
источник

Если порядок важен, а список велик, вы можете использовать этот двойной метод:

 l = [['john', 'sayyid'], ['john', 'simon'], ['b', 't']]

 def join(l1, l2):
     mset = set(l1)
     result = l1[:] # deep copy
     for each in l2:
         if each in mset:
             continue
         else:
             result.append(each)
     return result

Чтобы объединиться с основным списком, вы можете просто вызвать список по их рангу и вытолкнуть исходный список:

l1 = l.pop(0)
l2 = l.pop(0)
l.insert(0, join(l1, l2))
>>> l:
[['john', 'sayyid', 'simon'], ['b', 't']]
+1
21 дек. '18 в 14:14
источник
другие ответы

Связанные вопросы


Похожие вопросы

Чтобы объединить 2 списка:

merge = lambda l1, l2: l1 + [ x for x in l2 if x not in l1 ]

Чтобы быть более эффективным, создайте set на l1;

0
21 дек. '18 в 14:31
источник

Вы можете использовать collections.defaultdict для решения O (n):

from collections import defaultdict 

L = [['John', 'Sayyed'], ['John', 'Simon'], ['bush', 'trump']]

dd = defaultdict(list)

for x, y in L:
    dd[x].append(y)

res = [[k, *v] for k, v in dd.items()]

print(res)

[['John', 'Sayyed', 'Simon'], ['bush', 'trump']]
0
21 дек. '18 в 15:30
источник

Простой подход

L = [['John','Sayyed'], [ 'John' , 'Simon'] ,['bush','trump']]
L[0].extend([x for x in L[1] if x not in L[0]])
L.pop(1)
print(L) 

Увидеть

Список Пониманий

Добавить против Расширить

0
21 дек. '18 в 16:20
источник

Посмотрите другие вопросы по меткам или Задайте вопрос