选择列表列表的子列表来定义关系
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
,因此将使用它。
如果 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)]]]
如果我恰好有如下列表:
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
,因此将使用它。
如果 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)]]]