如何将列表拆分为python中没有重复元素的子集

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.谢谢!!

ton*_*ony 1

尝试这个:

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