设S(w)是一组单词。我想生成所有可能的子集的n组合,以便这些子集的并集总是等于S(w)。
所以你有一套(a,b,c,d,e)并且你不是所有3种组合:
((a,b,c),(d),(e))
((a,b),(c,d),(e))
((a),(b,c,d),(e))
((a),(b,c),(d,e))
等等......对于每个组合,您有3组,并且这些组合并为原始组。没有空集,没有遗漏元素。
必须有一种方法可以使用itertools.combination + collection.Counter来做到这一点,但我甚至无法从某个地方开始...... 有人可以帮忙吗?
路
编辑:我需要捕获所有可能的组合,包括:
((a,e),(b,d)(c))
等等......答案 0 :(得分:3)
这样的事情?
from itertools import combinations, permutations
t = ('a', 'b', 'c', 'd', 'e')
slicer = [x for x in combinations(range(1, len(t)), 2)]
result = [(x[0:i], x[i:j], x[j:]) for i, j in slicer for x in permutations(t, len(t))]
一般解决方案,对于任何n和任何元组长度:
from itertools import combinations, permutations
t = ("a", "b", "c")
n = 2
slicer = [x for x in combinations(range(1, len(t)), n - 1)]
slicer = [(0,) + x + (len(t),) for x in slicer]
perm = list(permutations(t, len(t)))
result = [tuple(p[s[i]:s[i + 1]] for i in range(len(s) - 1)) for s in slicer for p in perm]
[
(('a',), ('b', 'c')),
(('a',), ('c', 'b')),
(('b',), ('a', 'c')),
(('b',), ('c', 'a')),
(('c',), ('a', 'b')),
(('c',), ('b', 'a')),
(('a', 'b'), ('c',)),
(('a', 'c'), ('b',)),
(('b', 'a'), ('c',)),
(('b', 'c'), ('a',)),
(('c', 'a'), ('b',)),
(('c', 'b'), ('a',))
]