我有一个名为table的2D Matrix和一个名为count的列表。在表格中,数据存储在每列中数据集的数量中。 first_index只显示组合的数量,在这种情况下有588种组合(7 * 6 * 2 * 7) 现在我想创建任何与任何关系。我的代码是静态的,所以我需要有可能创建动态循环/变量。
表:
[1, 30, 50, 60]
[2, 31, 51, 61]
[3, 32, 0, 62]
[4, 33, 0, 63]
[5, 34, 0, 64]
[6, 35, 0, 65]
[7, 0, 0, 66]
数:
[7, 6, 2, 7]
代码在我的情况下工作正常,但不确定是否有超过4行,所以它不是很好的代码。我是python中的菜鸟,也许还有另一种解决这个问题的方法
for k in range(count[0]):
for kk in range(count[1]):
for kkk in range(count[2]):
for kkkk in range(count[3]):
print('{0:3} , {1:3} , {2:1}'.format(first_index, table[k][0], 1))
print( '{0:3} , {1:3} , {2:1}'.format(first_index, table[kk][1], 2))
print( '{0:3} , {1:3} , {2:1}'.format(first_index, table[kkk][2], 3))
print( '{0:3} , {1:3} , {2:1}'.format(first_index, table[kkkk][3], 4))
print
first_index+=1
输出看起来像
1 , 1 , 1
1 , 30 , 2
1 , 50 , 3
1 , 60 , 4
2 , 1 , 1
2 , 30 , 2
2 , 50 , 3
2 , 61 , 4
...
588 , 7 , 1
588 , 35 , 2
588 , 51 , 3
588 , 66 , 4
答案 0 :(得分:4)
这里使用的是itertools.product
,但使用了聪明的逻辑。
from itertools import product
def special_combinations(table):
for r in product(*zip(*table)):
if 0 in r:
continue
yield r
您根本不需要count
变量。使用此解决方案:
>>> table = [[1, 30, 50, 60],
[2, 31, 51, 61],
[3, 32, 0, 62],
[4, 33, 0, 63],
[5, 34, 0, 64],
[6, 35, 0, 65],
[7, 0, 0, 66]]
>>> for idx, val in enumerate(special_combinations(table)):
print idx+1, val
1 (1, 30, 50, 60)
2 (1, 30, 50, 61)
3 (1, 30, 50, 62)
4 (1, 30, 50, 63)
5 (1, 30, 50, 64)
6 (1, 30, 50, 65)
7 (1, 30, 50, 66)
8 (1, 30, 51, 60)
9 (1, 30, 51, 61)
10 (1, 30, 51, 62)
...
584 (7, 35, 51, 62)
585 (7, 35, 51, 63)
586 (7, 35, 51, 64)
587 (7, 35, 51, 65)
588 (7, 35, 51, 66)
奖金:单行:
[(i+1, R) for i, R in enumerate(r for r in product(*zip(*table)) if not 0 in r)]
注意:如果你从表中删除了零,你可以获得更好的性能。
>>> table
[[1, 30, 50, 60],
[2, 31, 51, 61],
[3, 32, 0, 62],
[4, 33, 0, 63],
[5, 34, 0, 64],
[6, 35, 0, 65],
[7, 0, 0, 66]]
>>> table = [t[:t.index(0)] if 0 in t else t for t in map(list, zip(*table))]
>>> table
[[1, 2, 3, 4, 5, 6, 7],
[30, 31, 32, 33, 34, 35],
[50, 51],
[60, 61, 62, 63, 64, 65, 66]]
然后你的解决方案就简单多了。
>>> [(i+1, R) for i, R in enumerate(r for r in product(*table))]
答案 1 :(得分:1)
此处如果使用itertools.product
:
from itertools import product
first_index=1
for i in product(*[range(i) for i in count]):
for j in range(len(count)):
print( '{0:3} , {1:3} , {2:1}'.format(first_index, table[i[j]][j], j+1))
first_index += 1