查找Python中所有解决方案列表中是否存在一组潜在值的最快方法

查找Python中所有解决方案列表中是否存在一组潜在值的最快方法,python,union,permutation,itertools,Python,Union,Permutation,Itertools,我不是为了这个例子而尝试这个,但我认为这是最简单的解释 假设您有一个潜在项目链,并希望找到已知解决方案列表中是否存在这些项目 solutions = ['GAT','CAT','GCT'] 你有以下潜力: potentials = [['G','T'],['T','A'],['T']] 这样,您就能够确定GAT是唯一可以从电势创建的解决方案 及 您希望找到所有可能的解决方案,例如 potentials = [['G','C','A','T'],['G','C','A'

我不是为了这个例子而尝试这个,但我认为这是最简单的解释

假设您有一个潜在项目链,并希望找到已知解决方案列表中是否存在这些项目

    solutions = ['GAT','CAT','GCT']
你有以下潜力:

    potentials = [['G','T'],['T','A'],['T']]
这样,您就能够确定GAT是唯一可以从电势创建的解决方案

您希望找到所有可能的解决方案,例如

    potentials = [['G','C','A','T'],['G','C','A','T'],['G','C','A','T']]
将返回['GAT','CAT','GCT',],因为所有的解决方案都可以从电势中得到

我当前的解决方案只是使用连接构建所有组合,然后进行交叉

由于下一步,理想的解决方案将实际返回解决方案,从而输出每个项目的可行选项,从而:

    solutions = ['GAT','CAT','GCT']
    potentials = [['G','C','A','T'],['G','C','A'],['A','T']]
    imaginaryfunction(potentials, solutions)
将返回:

     [['G','C'],['C','A'],['T']]
如果有关系的话,在我的现实世界中,有30个“字母”,潜在列表中的任何给定项目可能最多有8个“字母”。解决方案列表约为2000个三字母组合。在一个理想的世界中,只有一种组合是有效的,但更典型的是有4或5种组合,这是可能的,但极不可能所有2000种组合都是可能的

我已经尝试过一些非常疯狂的事情,从连接到从每个组合中提取一个以30为基数的数字,这样我就可以检查这个数字是否在列表中,然后将所有的解决方案分解到一个字典字典中,看看是否有这些项

我的代码循环了上百次,甚至上百万次,所以即使是很小的收益,对我来说也会很快累积起来

编辑/附加信息:

这在几个地方都有使用。我正在与一个进行药物相互作用模拟的小组合作,他们正在研究可能是附着点/结合点的链

它还用于一家公司,该公司每月提供“个人设计师会挑选你的衣柜”的包装盒。(在这种情况下,第一组火柴可能是XS、S、M、L、LT、XL、XXL,第三组火柴可能是红色、绿色、蓝色、黑色、白色,第二组袖长)(他们实际上没有人挑选盒子里的东西)

同样的代码块也在我的NGram分析代码中


约会应用程序中的代码块与种族、性别、年龄、收入相同

,因为与理论上可能的组合数(30^8的顺序)相比,你的解决方案集非常小(2000)。我认为类似的方法可以奏效:

solutions = get_possible_solutions()
for i, pset in enumerate(potentials):
    matching_solutions = []
    for sol in solutions:
        if sol[i] in pset:
            matching_solutions.append(sol)
    solutions = matching_solutions # Remove non-matches
此解决方案使用项目“字符串”中当前字母的潜在值迭代过滤可能的解决方案。 每次迭代,内部循环都会变小,因此这可能会非常快。
它至少应该比在所有可能的解和输入解之间进行显式求交快得多。

在第一个示例中,您如何“确定GAT是唯一的解”?为什么不是猫?你能描述一下你使用的过程吗?因为我太累了,错过了那只猫可能是一个解决办法。将进行编辑以反映。您实际上想做什么?某种DNA到密码子的翻译?描述生物信息学问题如果你是用蛮力来做的,那么很容易,如果这是时间和组合的问题,你需要看看元启发式算法。但是,暴力是知道你得到所有结果的唯一解决方案。@Chris_Rands我支持的几个产品中存在相同的功能,每个都略有不同。我试图统一代码,但也加快了速度。这是一个很好的解决方案。它的测试速度非常快。我会做一些计时,看看它是如何叠加到相交的。我还将构建一些示例代码,并共享它,它使用了这种机制,但针对多次运行进行了优化。谢谢
    solutions = ['GAT','CAT','GCT']