读了很长时间,我第一次找不到我正在做的事情的答案。
我有一个包含 93 个字符串的列表,每个字符串长度为 6 个字符。从这 93 个字符串中,我想确定一组 20 个字符串,它们都符合相对于集合中其他字符串的特定标准。虽然 itertools.combinations 会给我所有可能的组合,但并非所有条件都值得检查。
例如,如果 [list[0], list[1], etc] 因为 list[0] 和 list[1] 不能在一起而失败,那么其他 18 个字符串是什么都没关系,该集合每次都会失败,那是一大堆浪费的检查。
目前我有 20 个嵌套的 for 循环,但似乎必须有更好/更快的方法来做到这一点。:
for n1 in bclist:
building = [n1]
n2bclist = [bc for bc in bclist if bc not in building]
for n2 in n2bclist: #this is the start of what gets repeated 19 times
building.append(n2)
if test_function(building): #does set fail? (counter intuitive, True when fail, False when pass)
building.remove(n2)
continue
n3bclist = [bc for bc in bclist if bc not in building]
#insert the additional 19 for loops, with n3 in n3, n4 in n4, etc
building.remove(n2)
第 20 个 for 循环中有打印语句来提醒我是否存在一组 20 个。for 语句至少允许我在单个加法失败时尽早跳过集合,但不记得更大的组合何时失败:
例如[list[0], list[1]]
失败,所以跳到[list[0], [list[2]]
哪个通过。接下来是[list[0], list[2], list[1]]
哪个会失败,因为 0 和 1 再次在一起,所以它将移动到[list[0], list[2], list[3]]
可能通过或不通过的哪个。我担心的是最终它也会测试:
[list[0], list[3], list[2]]
[list[2], list[0], list[3]]
[list[2], list[3], list[0]]
[list[3], list[0], list[2]]
[list[3], list[2], list[0]]
所有这些组合都将具有与以前的组合相同的结果。基本上,我交换了 itertools.combinations 的恶魔测试所有我知道失败的集合组合,因为早期值失败了 for 循环的恶魔,当我不关心它们的顺序时,它们将值的顺序视为一个因素。这两种方法都显着增加了我的代码完成所需的时间。
任何关于如何摆脱恶魔的想法将不胜感激。