我有一组可以包含多个“N选2”组合结果的配对。
我想将这些组合反转,像这样:
我用蛮力成功做到了。
有没有更聪明的方法来做这件事?或者有一些优化的代码可以添加吗?
inputs = {
('id1', 'id2'), ('id1', 'id3'), ('id1', 'id4'),
('id2', 'id3'), ('id2', 'id4'),
('id3', 'id4'), ('id3', 'id5'),
('id4', 'id5'),
('id5', 'id6'),
}
我想将这些组合反转,像这样:
recombinations = [
('id1', 'id2', 'id3', 'id4'),
('id3', 'id4', 'id5'),
('id5', 'id6'),
]
我用蛮力成功做到了。
ids = list(sorted( {i for i in itertools.chain(*inputs)} ))
excludes = set()
recombinations = {tuple(i) for i in map(sorted, inputs)}
for i in range(3, len(ids)+1):
for subset in itertools.combinations(ids, i):
for j in range(i-1, len(subset)):
combs = set(itertools.combinations(subset, j))
if all(tup in recombinations for tup in combs):
recombinations.add(subset)
excludes = excludes.union(combs)
for tup in excludes:
recombinations.remove(tup)
print(recombinations)
{('id1', 'id2', 'id3', 'id4'), ('id3', 'id4', 'id5'), ('id5', 'id6')}
有没有更聪明的方法来做这件事?或者有一些优化的代码可以添加吗?
(1, 2, 3, 4)选2
,(3, 4, 5)选2
和(5, 6)选2
组成的。 - undefinedS
,使得S
中的每对元素都出现在input
中,并且不能添加任何元素到S
中而仍然保持这个属性。是这样吗?如果是的话,这就是在图中找到所有最大团的问题,你可以直接使用 NetworkX 解决这个问题。 - undefined