首页 > 解决方案 > 从平面列表中查找所有列表和子列表组合

问题描述

我试图找到一种优雅的方式来从初始平面列表中生成所有可能的组合。

例如:

[在:]

l = ["aaa", "bbb", "ccc"]

[出去:]

[["aaa"], ["bbb"], ["ccc"]]
[["aaa", "bbb"], ["ccc"]]
[["aaa", "ccc"], ["bbb"]]
[["bbb", "ccc"], ["aaa"]]
[["aaa", "bbb", "ccc"]]

正如你在这里看到的,顺序对我来说并不重要。所以我会避免获得这种情况:

[["aaa"], ["bbb"], ["ccc"]]
[["bbb"], ["aaa"], ["ccc"]]
...
[["ccc"], ["aaa"], ["bbb"]]

我的输出列表的每个子列表也必须包含我的初始列表的每个元素。

我找不到任何明显的解决方案itertools.combination()

谢谢

标签: pythonlistcombinationsitertools

解决方案


问题很模糊,我认为您正在寻找的是设置分区:

def partition(collection):
    if len(collection) == 1:
        yield [ collection ]
        return

    first = collection[0]
    for smaller in partition(collection[1:]):
        # insert `first` in each of the subpartition's subsets
        for n, subset in enumerate(smaller):
            yield smaller[:n] + [[ first ] + subset]  + smaller[n+1:]
        # put `first` in its own subset 
        yield [ [ first ] ] + smaller


something = ['a', 'b', 'c']

for n, p in enumerate(partition(something), 1):
    print(n, sorted(p))

输出:

1 [['a', 'b', 'c']]
2 [['a'], ['b', 'c']]
3 [['a', 'b'], ['c']]
4 [['a', 'c'], ['b']]
5 [['a'], ['b'], ['c']]

推荐阅读