选择列表列表的子列表来定义关系

Selecting sublists of a list of lists to define a relation

如果我恰好有如下列表:

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)])

作为我的关系列表中的一个元素。

我希望有一个最佳的方法来做到这一点,因为在原始上下文中我必须处理更大的列表列表。

非常感谢您提供的任何帮助。

您确实没有提供足够的信息,所以无法判断您是否需要itertools.combinations()itertools.permutations()。您的示例适用于 itertools.combinations,因此将使用它。

如果 xy 是列表的两个元素,那么您只需要 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)]]]