繁体   English   中英

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

[英]Fastest way to find if a Group of potentials exists in a list of all solutions in Python

我试图用这个例子以外的东西,但我认为这将是最简单的解释。

考虑您有一系列潜在的项目,并希望查找是否存在于已知的解决方案列表中。

    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']因为所有解决方案都可以从潜力中获得。

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

由于下一步,理想的解决方案实际上会返回解决方案,以便输出每个项目的可行选项,以便:

    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,这样我就可以检查数字是否在列表中,将所有解决方案分解为字典词典并查看是否那些物品在那里。

如果不是数百万次,我的代码会循环通过这100个数千个,所以即使很小的收益也会快速增加。

编辑/附加信息:

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

它也被用于那些“个人造型师将挑选你的衣柜”每月盒子的公司。 (在这种情况下,它可能是第一场比赛的XS,S,M,L,LT,XL,XXL,红色,绿色,蓝色,黑色,白色,第三个袖子长度为第三个)(他们不喜欢)实际上有人选择框中的内容)

同样的代码块也出现在我的NGram Analysis代码中。

相同的代码块在约会应用程序中作为种族,性别,年龄,收入

由于你的解决方案组很小(2000),与理论上可能的组合数量(30 ^ 8的顺序)相比,我觉得这样的事情可以起作用:

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

该解决方案使用项目“字符串”中当前字母的电位迭代过滤可能的解决方案。 内循环每次迭代都会变小,因此有可能非常快。 它至少应该比在所有可能的解决方案和输入解决方案之间进行明确交叉更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM