具有条件函数的组合,用于组合 Python 中的每 2 个元素

Combinations with a conditional function for combining every 2 elements in Python

我有一组(最多 40 个)组件 ['c1','c2','c3','c4','c5',...] 和:

我有一个函数可以 verify_combination(component1,component2) 通过查询数据库 table。如果是禁止组合,它将 return False。如果我假设禁止组合 (c1,c3) 以及 (c4,c5),最后我会得到这样的结果:

combinations = [(c1,c2),(c1,c4),(c1,c5),(c2,c3),(c2,c4),(c2,c5),(c3,c4),(c3,c5), (c1,c2,c4),(c1,c2,c5),(c2,c3,c4),(c2,c3,c5)]
    
# (I believe that's right)
# (In this case no valid combinations of r=4 would be produced)

我在 python 和整体编程方面不是很有经验,而且我严重缺乏数学技能来为这种 与条件或条件的组合建模 。在过去的几个小时里,我一直在尝试这样做,试图找到已经在网上编写的类似代码,并且还尝试使用 itertools,但甚至没有接近解决方案。

如果我对问题的理解正确,我可能会从 itertools.combinations 开始,这将 return 输入列表成员的可迭代对象。然后你可以过滤掉非法组合。

from itertools import combinations as combos, chain
from functools import filter

pairs = filter(verify_combination, combos(input_list, 2))
triples = filter(verify_combination, combos(input_list, 3))
quads = filter(verify_combination, combos(input_list, 4))

combined_combos = list(chain(pairs, triples, quads))