首页 > 解决方案 > 两个或多个列表的所有可能组合(包括所有子集组合)

问题描述

我搜索了网络,但找不到任何东西。我正在尝试获取所有可能的组合,包括两个列表的所有子集组合(最好是 n 个列表)。所有组合都应包括每个列表中的至少一项。

list_1 = [1,2,3]
list_2 = [5,6]

output = [
    [1,5], [1,6], [2,5], [2,6], [3,5], [3,6],
    [1,2,5], [1,2,6], [1,3,5], [1,3,6], [2,3,5], [2,3,6], [1,5,6], [2,5,6], [3,5,6],
    [1,2,3,5], [1,2,3,6], 
    [1,2,3,5,6]
]

我所能得到的只是像 [1,5], [1,6], .. 这样的配对组合,通过使用

combs = list(itertools.combinations(itertools.chain(*ls_filter_columns), cnt))

实现这一目标的pythonic方式是什么?

标签: python-3.xlist

解决方案


这是一种方法:

from itertools import combinations, product

def non_empties(items):
    """returns nonempty subsets of list items"""
    subsets = []
    n = len(items)
    for i in range(1,n+1):
        subsets.extend(combinations(items,i))
    return subsets
    
list_1 = [1,2,3]
list_2 = [5,6]

combs = [list(p) + list(q) for p,q in product(non_empties(list_1),non_empties(list_2))]
print(combs)

输出:

[[1, 5], [1, 6], [1, 5, 6], [2, 5], [2, 6], [2, 5, 6], [3, 5], [3, 6], [3, 5, 6], [1, 2, 5], [1, 2, 6], [1, 2, 5, 6], [1, 3, 5], [1, 3, 6], [1, 3, 5, 6], [2, 3, 5], [2, 3, 6], [2, 3, 5, 6], [1, 2, 3, 5], [1, 2, 3, 6], [1, 2, 3, 5, 6]]

哪个元素比您提供的输出更多,但我怀疑您的预期输出有误。请注意,我的代码可能无法正确处理两个列表存在非空交集的情况。再说一次,它可能 - 您没有指定在这种情况下预期的输出应该是什么。


推荐阅读