Python将列表元素分组,所有元素都会被分组。

问题描述 投票:0回答:1

我想得到所有可能的分组。所有元素都必须被分配。如果我使用 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]]我不需要的组。

有什么方法可以优雅地解决这个问题吗?先谢谢你

python grouping itertools
1个回答
0
投票

你可以使用 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]]]
© www.soinside.com 2019 - 2024. All rights reserved.