【发布时间】:2021-11-04 18:35:30
【问题描述】:
我正在尝试在列表中查找特定的项目组合。该列表由重复 y 次的 x 组组成。在这个例子中 x 和 y = 3,但实际上可能更大。我想找到组和 y 的每个组合,但不为给定组合复制 x 值。我认为只展示我想要的示例会更容易。
这是一个例子。
A = ['ST1_0.245', 'ST1_0.29', 'ST1_0.335', 'ST2_0.245', 'ST2_0.29', 'ST2_0.335', 'ST3_0.245', 'ST3_0.29', 'ST3_0.335']
所以三个组,ST1、ST2 和 ST3——每个组有 3 次迭代,0.245、0.290 和 0.335。
我想找到以下组合。
('ST1_0.245', 'ST2_0.245', 'ST3_0.245')
('ST1_0.245', 'ST2_0.245', 'ST3_0.29')
('ST1_0.245', 'ST2_0.245', 'ST3_0.335')
('ST1_0.245', 'ST2_0.29', 'ST3_0.245')
('ST1_0.245', 'ST2_0.29', 'ST3_0.29')
('ST1_0.245', 'ST2_0.29', 'ST3_0.335')
('ST1_0.245', 'ST2_0.335', 'ST3_0.245')
('ST1_0.245', 'ST2_0.335', 'ST3_0.29')
('ST1_0.245', 'ST2_0.335', 'ST3_0.335')
('ST1_0.29', 'ST2_0.245', 'ST3_0.245')
('ST1_0.29', 'ST2_0.245', 'ST3_0.29')
('ST1_0.29', 'ST2_0.245', 'ST3_0.335')
('ST1_0.29', 'ST2_0.29', 'ST3_0.245')
('ST1_0.29', 'ST2_0.29', 'ST3_0.29')
('ST1_0.29', 'ST2_0.29', 'ST3_0.335')
('ST1_0.29', 'ST2_0.335', 'ST3_0.245')
('ST1_0.29', 'ST2_0.335', 'ST3_0.29')
('ST1_0.29', 'ST2_0.335', 'ST3_0.335')
('ST1_0.335', 'ST2_0.245', 'ST3_0.245')
('ST1_0.335', 'ST2_0.245', 'ST3_0.29')
('ST1_0.335', 'ST2_0.245', 'ST3_0.335')
('ST1_0.335', 'ST2_0.29', 'ST3_0.245')
('ST1_0.335', 'ST2_0.29', 'ST3_0.29')
('ST1_0.335', 'ST2_0.29', 'ST3_0.335')
('ST1_0.335', 'ST2_0.335', 'ST3_0.245')
('ST1_0.335', 'ST2_0.335', 'ST3_0.29')
('ST1_0.335', 'ST2_0.335', 'ST3_0.335')
请注意,ST1、ST2 和 ST3 在每个组合中仅出现一次。
这是我至少要在小案例中使用的代码。
import itertools
import numpy as np
comb = []
gr_list=['ST1','ST2','ST3']
for itr in itertools.combinations(A, len(gr_list)):
# pdb.set_trace()
for n in np.arange(len(gr_list)):
if sum(itr[n].split('_')[0] in s for s in itr) > 1:
break
if n == len(gr_list)-1:
comb.append(itr)
这适用于我测试的几个小示例,但是当我尝试更大的值时,我得到的结果比我想象的要多,但这可能是我尝试计算预期数量时的错误。但无论哪种方式,都需要很长时间。有没有更快的方法来做到这一点?
我确实分别拥有这两个值。在我写这篇文章时,我觉得这是一种更好的方法,但我也不知道该怎么做。
【问题讨论】:
-
“我得到的结果比我想象的要多”-在您的示例中,第一个值有 3 个选择乘以第二个值有 3 个选择,最后一个值有 3 个选择,即 3x3x3 = 27 . 所以是的,输出的大小会很快变得非常大。你打算用这样的输出做什么?