我想10个人划分到3个组(A,B,C)中,也就是每个人都有三种选择,所以一共有3**10=59049种,想最终得出来的结果是
A=[1],B=[2],C=[3,4,5,6,7,8,9,10]
A=[1],B=[3],C=[2,4,5,6,7,8,9,10]
A=[1],B=[4],C=[2,3,5,6,7,8,9,10]
························································
A=[3,4,5,6,7,8,9,10],B=[2], C=[1]
可以尝试用itertools这个模块进行迭代,这个模块里面有很多创建迭代器的函数。
给一个思路:
第一组的元素个数最多可能有8个,取值范围为1-10。
当第一个组为1个元素的时候,第二组的元素个数最多可能为8个;
当第一个组为2个元素的时候,第二组的元素个数最多可能为7个;
以此类推,当第一个组为i个元素的时候,第二组的元素个数最可能为9-i,取值范围为1-10,并减去第一组的元素,剩余记为rem。
第三组的元素则为rem减去第二组中的元素。
itertools.combinations可以对一个集合的元素按照个数进行不同的组合,例如,从1-10中任取2个数字,可能有以下组合。
import itertools
L1 = itertools.combinations(range(1,11), 2)
print(list(L1))
[(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (2, 10), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (3, 10), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (4, 10), (5, 6), (5, 7), (5, 8), (5, 9), (5, 10), (6, 7), (6, 8), (6, 9), (6, 10), (7, 8), (7, 9), (7, 10), (8, 9), (8, 10), (9, 10)]
所以,可以按照如下方式写代码:
import itertools
count=0
set_all=set(range(1,11))
for i in range(1,9):
for L1 in itertools.combinations(range(1,11), i):
rem=set_all-set(L1)
for j in range(1,10-i):
for L2 in itertools.combinations(rem, j):
L3=rem-set(L2)
count+=1
print(count,end=' ')
print(set(L1),set(L2),L3)
arr = [1,2,3,4,5,6,7,8,9,10]
res = [[(),(),()]]
for n in arr:
t = []
for g in res:
for i in range(3):
a = g.copy()
a[i] = a[i]+(n,)
t.append(a)
res = t
res = list(filter(lambda x: () not in x, res))
print(*res,sep="\n")
用itertools中的permutations和combinations。
如果组可以为空,这样写代码就行:
import itertools
count=0
set_all=set(range(1,11))
for i in range(0,11):
for L1 in itertools.combinations(range(1,11), i):
rem=set_all-set(L1)
for j in range(0,11-i):
for L2 in itertools.combinations(rem, j):
L3=rem-set(L2)
count+=1
print(count,end=' ')
print(set(L1),set(L2),L3)
共59049种组合。当然,最后的结果显示需要优化一下。
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,目前超出我们的服务范围,暂时无法为您解答。
首次提问人员可免费体验一次有问必答服务。目前首次提问的问题服务范围为:编程语言、Java开发、python、数据库、前端开发 领域专业技术问题,为您提供问题的解决思路和指导。不提供源码代写、项目文档代写、论文代写、安装包资源发送或安装指导等服务。
我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。