成对组合的组,每个成员仅出现一次

时间:2019-05-28 11:04:39

标签: python combinations itertools

我有一个唯一元组列表,每个元组包含2个从1到10的元素。列表中的元素总数为45。我想将它们分为10组,每个组仅包含1到10的数字。

我尝试使用以下答案解决问题: python get groups of combinations that each member appear only once

from itertools import combinations, chain
l = ['A','B','C','D','E', 'F', 'G','H','I','J']
c = list(combinations(l,2))
[set(i) for i in list(combinations(c,5)) if (len(set(l) & set(chain(*i))) == len(l))]

但是我得到重复,就像这样:

[{(('A','B'),('C','D'),('E','F'),('G','H'),('I', 'J')},  {('A','B'),('C','D'),('E','F'),('G','I'),('H','J') },...]

1 个答案:

答案 0 :(得分:0)

不是10对,但是有945个这样的对可以满足您的条件

我做了什么,得到所有的数字排列,创建一个字典 保持所有组合为键。

现在,对于每个排列元素,我将它们成对成对2 ie [1,2,3,4] is [(1,2),(2,3),(3,4)]

这将创建一个列表

现在对于所有此类列表及其元素,我已经从字典中比较了它们是否存在于字典中。

ps。这是一个耗时且耗时的解决方案,借助图论,我们可以大大减小尺寸。

from itertools import combinations, permutations
l=['A','B','C','D','E','F','G','H','I','J']
c=list(permutations(l))
d=list(combinations(l,2))
from collections import defaultdict

dic = defaultdict(int)

for i in d:
    dic[i]=1


new =[]
for i in c:
    tmp=[]
    for j in range(1,len(i),2):
        tmp.append((i[j-1],i[j]))
    new.append(tmp)


final =[]

for i in new:
    flag =True
    count =0 
    for j in i:
        try:
            if dic[j]:
                count+=1
                pass

        except:
            flag=False
            count=0
            break
    if flag and count==5:
        final.append(i)

final2 = [tuple(sorted(i)) for i in final]   

solution = list(set(final2))
print(solution)

将有945个这样的值对