Выбор подсписков из списка списков для определения отношения - PullRequest
0 голосов
/ 21 сентября 2018

Если у меня есть следующий список списков:

L=[[(1,3)],[(1,3),(2,4)],[(1,3),(1,4)],[(1,2)],[(1,2),(1,3)],[(1,3),(2,4),(1,2)]]

и что я хочу сделать, это создать связь между списками следующим образом:

Я хочусказать, что

[(1,3)] and [(1,3),(1,4)]

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

Relations=[([(1,3)],[(1,3),(1,4)])]

, но,мы также можем видеть, что:

[(1,3)] and [(1,3),(2,4)]

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

Relations=[([(1,3)],[(1,3),(1,4)]),([(1,3)],[(1,3),(2,4)])]

Единственное, с чем я хотел бы быть осторожным, это то, что я рассматриваю список как подсписок другого, если они отличаются только ОДНЫМ элементом.Другими словами, мы не можем иметь:

([(1,3)],[(1,3),(2,4),(1,2)]) 

в качестве элемента моего списка отношений, но мы ДОЛЖНЫ иметь:

([(1,3),(2,4)],[(1,3),(2,4),(1,2)])

в качестве элемента в моем списке отношений.

Я надеюсь, что есть оптимальный способ сделать это, поскольку в исходном контексте мне приходится иметь дело с гораздо большим списком списков.

Любая предоставленная помощь очень ценится.

1 Ответ

0 голосов
/ 21 сентября 2018

Вы действительно не предоставили достаточно информации, поэтому не можете определить, нуждаетесь ли вы в itertools.combinations() или itertools.permutations().Ваши примеры работают с itertools.combinations, поэтому будем использовать это.

Если x и y являются двумя элементами списка, то вам просто нужны все вхождения, где set(x).issubset(y) и размер установленной разностисоставляет <= 1 - len(set(y) - set(x)) <= 1, например:

In []:
[[x, y] for x, y in it.combinations(L, r=2) if set(x).issubset(y) and len(set(y)-set(x)) <= 1]

Out[]:
[[[(1, 3)], [(1, 3), (2, 4)]],
 [[(1, 3)], [(1, 3), (1, 4)]],
 [[(1, 3)], [(1, 2), (1, 3)]],
 [[(1, 3), (2, 4)], [(1, 3), (2, 4), (1, 2)]],
 [[(1, 2)], [(1, 2), (1, 3)]],
 [[(1, 2), (1, 3)], [(1, 3), (2, 4), (1, 2)]]]
...