Python如何从组中获取所有元素的组合,每个组中最多有一个元素,其中一个组中至少有一个元素

Python如何从组中获取所有元素的组合,每个组中最多有一个元素,其中一个组中至少有一个元素,python,combinations,Python,Combinations,我在Python 3中工作 我有如下五个列表: l1 = [1, 2] l2 = ['A', 'B', 'C'] l3 = ['d', 'e', 'f', 'g'] l4 = ['word1', 'word2', 'word3', 'word4', 'word5'] l5 = [10, 20, 30, 40, 50, 60] 列表长度可变,每个列表中的每个元素都是唯一的。 我希望在列表中找到满足以下条件的所有可能的元素组合: 每个组合至少作为一个列表中的一个元素,因此没有组合为空。换句话说,空

我在Python 3中工作

我有如下五个列表:

l1 = [1, 2]
l2 = ['A', 'B', 'C']
l3 = ['d', 'e', 'f', 'g']
l4 = ['word1', 'word2', 'word3', 'word4', 'word5']
l5 = [10, 20, 30, 40, 50, 60]
列表长度可变,每个列表中的每个元素都是唯一的。 我希望在列表中找到满足以下条件的所有可能的元素组合:

  • 每个组合至少作为一个列表中的一个元素,因此没有组合为空。换句话说,空列表
    []
    是不允许的组合
  • 每个组合在每个列表中最多有一个元素,因此没有组合在同一个列表中有多个元素。例如,这些列表中的每一个都不允许作为组合使用:
    [1',a',B'],['d',e'],['C',word2',word3']
  • 允许组合在每个列表中包含少于一个元素。例如,这些列表中的每一个都是单独允许的组合:
    [1],[1',a'],[1',a',d'],[1',a',d',word1'],[1',a',d',word1',10]
  • 秩序不重要。我对组合感兴趣,而不是排列。例如,
    [1',A']
    是与
    [A',1]
    相同的组合,
    [1',B',word2']
    是与
    [B',word2',1]
    相同的组合
  • 组合不应该有相同元素的重复项。例如,这些列表中的每一个都不允许作为组合使用:
    [1,1,'a'],['a','d','a']
  • 这些条件的结果是,每个组合将至少有一个元素,最多有五个元素

    像上面提到的那样的解决方案将不起作用,因为它不满足上述条件3


    我正在寻找一个优雅而高效的解决方案。我也在寻找一个通用的解决方案,因为我使用的实际列表在大小和内容上与上面给出的列表不同。

    在每个列表中添加一个空元素,表示不包括该列表中的任何元素:

    all_lists = [l + [None] for l in [l1, l2, l3, l4, l5]]
    
    现在,简单地循环所有排列,删除
    None
    元素:

    for cross in itertools.product(*all_lists):
        combo = [item for item in cross if item is not None]   # Remove "None" elements
        if combo:    # Ignore the empty list
            print(combo)
    
    或者,要将它们收集到列表中,可以使用(嵌套)理解:

    result = [combo for combo in [
        [item for item in cross if item is not None]
        for cross in itertools.product(*all_lists)]
            if combo]
    
    你可以试试这个

    l1 = [1, 2]
    l2 = ['A', 'B', 'C']
    l3 = ['d', 'e', 'f', 'g']
    l4 = ['word1', 'word2', 'word3', 'word4', 'word5']
    l5 = [10, 20, 30, 40, 50, 60]
    
    import itertools as itt
    
    result = []
    for n in range(1, 5):
        for ls in itt.combinations([l1, l2, l3, l4, l5], n):
            result+= list(itt.product(*ls))
            
    print(result)
    

    条件5是多余的。由于一个组中不能有多个元素,而且组是不相交的,因此不能有重复元素:这将是其组中的第二个元素。是的,我知道条件5是多余的。为了清晰起见,我只想明确地包含它,因为计算允许重复的组合与计算不允许重复的组合不同。