use*_*103 7 python list python-itertools
我需要一个列表(最多n=31)的代码并返回所有可能的子集,n=3而没有任何两个元素在同一个子集中重复两次(想想每次与新人组成3人小组的人):
list=[1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)
并返回
[1,2,3][4,5,6][7,8,9]
[1,4,7][2,3,8][3,6,9]
[1,6,8][2,4,9][3,5,7]
Run Code Online (Sandbox Code Playgroud)
但不是:
[1,5,7][2,4,8][3,6,9]
Run Code Online (Sandbox Code Playgroud)
因为1和7已经一起出现(同样,3和9).
我也想为子集做这个n=2.谢谢!!
尝试这个:
from itertools import permutations
lst = list(range(1, 10))
n = 3
triplets = list(permutations(lst, n))
triplets = [set(x) for x in triplets]
def array_unique(seq):
checked = []
for x in seq:
if x not in checked:
checked.append(x)
return checked
triplets = array_unique(triplets)
result = []
m = n * 3
for x in triplets:
for y in triplets:
for z in triplets:
if len(x.union(y.union(z))) == m:
result += [[x, y, z]]
def groups(sets, i):
result = [sets[i]]
for x in sets:
flag = True
for y in result:
for r in x:
for p in y:
if len(r.intersection(p)) >= 2:
flag = False
break
else:
continue
if flag == False:
break
if flag == True:
result.append(x)
return result
for i in range(len(result)):
print('%d:' % (i + 1))
for x in groups(result, i):
print(x)
Run Code Online (Sandbox Code Playgroud)
n = 10 的输出: http://pastebin.com/Vm54HRq3
| 归档时间: |
|
| 查看次数: |
1654 次 |
| 最近记录: |