我想得到所有可能的分组。所有元素都必须被分配。如果我使用 itertools.permutations,我会错过一些分组。
from itertools import permutations, chain
testlist = [1, 2, 3]
print(all_group_assignments(testlist))
def all_group_assignments(list):
groups = []
for i in range(0, len(list)+1):
for splits in permutations(range(1, len(list)), i):
prev = None
result = []
for split in chain(splits, [None]):
result.append(list[prev:split])
prev = split
groups.append(result)
return groups
我收到这样的结果:
[[[1, 2, 3]], [[1], [2, 3]], [[1, 2], [3]], [[1], [2], [3]], [[1, 2], [], [2, 3]]]
遗漏了[[1, 3], [2]]组,而包含了[[1, 2], [], [2, 3]]我不需要的组。
有什么方法可以优雅地解决这个问题吗?先谢谢你
你可以使用 itertools.combinations
为任务。
例如
from itertools import combinations
lst = [1, 2, 3]
out = [[[i] for i in lst]]
for i in range(2, len(lst)+1):
for p in combinations(out[0], i):
out.append([])
group, seen = sum(p, []), set()
for v in out[0]:
if v[0] not in group and v[0] not in seen:
out[-1].append(v)
elif v[0] in group and v[0] not in seen:
out[-1].append(group)
seen = set(group)
group = []
print(out)
打印:
[[[1], [2], [3]], [[1, 2], [3]], [[1, 3], [2]], [[1], [2, 3]], [[1, 2, 3]]]