【发布时间】:2015-05-08 18:00:26
【问题描述】:
我想找到一个算法,给定一个集合A 来找到满足以下条件的所有子集组:
x ∪ y ∪ .... z = A,其中 x, y, ... z ∈ Group
和
∀ x,y ∈ 组:x ⊆ A, y ⊆ A, x ∩ y = ∅ = {}
和
∀ x ∈ 组:x != ∅
注意:我希望定义好,我不擅长数学符号
我采用以下方法仅搜索两个子集的组:
from itertools import product, combinations
def my_combos(A):
subsets = []
for i in xrange(1, len(A)):
subsets.append(list(combinations(A,i)))
combos = []
for i in xrange(1, 1+len(subsets)/2):
combos.extend(list(product(subsets[i-1], subsets[-i])))
if not len(A) % 2:
combos.extend(list(combinations(subsets[len(A)/2-1], 2)))
return [combo for combo in combos if not set(combo[0]) & set(combo[1])]
my_combos({1,2,3,4})
我得到以下输出,这些都是由两个子集组成的组
[
((1,), (2, 3, 4)),
((2,), (1, 3, 4)),
((3,), (1, 2, 4)),
((4,), (1, 2, 3)),
((1, 2), (3, 4)),
((1, 3), (2, 4)),
((1, 4), (2, 3))
]
..... 但是,由一个、三个、四个子集组成的组......
问题:
我怎样才能找到一个通用的解决方案?
例如以下预期输出:
my_combos({1,2,3,4})
[
((1,2,3,4)),
((1,2,3),(4,)),
((1,2,4),(3,)),
((1,3,4),(2,)),
((2,3,4),(1,)),
((1,2),(3,4)),
((1,3),(2,4)),
((1,4),(2,3)),
((1,2),(3,),(4,)),
((1,3),(2,),(4,)),
((1,4),(2,),(3,)),
((1,),(2,),(3,4)),
((1,),(3,),(2,4)),
((1,),(4,),(2,3)),
((1,),(4,),(2,),(3,))
]
【问题讨论】:
标签: python algorithm python-3.x set subset