我正在努力使用itertools排列和组合在一起。最终,我试图创建一个矩阵,其中包含各种机器排列之间的客户可能组合。我相信我有组合的作品,但无法向脚本添加排列。
到目前为止,这是我的代码:
import itertools
Mach = [1,2,3,4]
Cust = [1,2,3,4,5,6,7,8,9,10,11,12]
a = len(Cust)
for n in range(a):
print list(itertools.combinations(Cust,n))
n = n+1
理想情况下,我想解决以下所有可能的输出:
1 - 1,2,3
2 - 4,5,6
3 - 7,8,9
4 - 10,11,12
任何帮助或指导将不胜感激。
更新: 原谅我的无知,使用Product不一定能提供我所追求的结果。我要做的是创建计算机上的客户列表,每个客户一次(一次)仅反映在一台计算机上,然后迭代地创建此组合的另一个矩阵;对于所有可能的组合。我相信这是一个组合,而不是排列问题,至于输出,我确实认为1、1、2、3和1、3、2、1是相同的。
示例: (Cust1,Mach1); (Cust2,Mach1); (Cust3,Mach2); (Cust4,Mach2); (Cust5,Mach2); (Cust6,Mach3); (Cust7,Mach3); (Cust8,Mach3); (Cust9,Mach3); (Cust10,Mach3); (Cust11,Mach4); (Cust12,Mach4)
后跟(例如): (Cust1,Mach1); (Cust2,Mach2); (Cust3,Mach2); (Cust4,Mach2); (Cust5,Mach2); (Cust6,Mach3); (Cust7,Mach3); (Cust8,Mach3); (Cust9,Mach3); (Cust10,Mach4); (Cust11,Mach4); (Cust12,Mach4)
等...
答案 0 :(得分:0)
product
和combinations
都不是您真正想要的。您想将Mach
的每个项目与Cust
的项目的集合配对。
n = len(cust)/len(m)
for i, m in enumerate(mach):
print(m, cust[n*i: n*(i+1)])
答案 1 :(得分:0)
这是使用itertools.combination
的递归解决方案。想法是为第一台机器选择组合,然后为其余客户和机器递归生成组合。
此解决方案是在Python3中开发的,但应该适用于Python2。
import itertools
def group_combinations(machines, customers):
if not machines:
yield {}
else:
for group in itertools.combinations(customers, len(customers) // len(machines)):
remaining = [c for c in customers if c not in group]
for others in group_combinations(machines[1:], remaining):
arrangement = {machines[0]: group}
arrangement.update(others)
yield arrangement
machines = [1, 2]
customers = [1, 2, 3, 4]
groups = group_combinations(machines, customers)
for comb in groups:
print(comb)
{1: (1, 2), 2: (3, 4)}
{1: (1, 3), 2: (2, 4)}
{1: (1, 4), 2: (2, 3)}
{1: (2, 3), 2: (1, 4)}
{1: (2, 4), 2: (1, 3)}
{1: (3, 4), 2: (1, 2)}