代码之家  ›  专栏  ›  技术社区  ›  psychcoder

从多个列表生成子集N的组合

  •  -1
  • psychcoder  · 技术社区  · 2 年前

    我有4个元素列表,并试图从这些列表中生成元素的组合。具体来说,我希望每个组合在每个列表中都有一个元素。然而,我只希望每个组合中有3个元素。我还想记录哪些元素被遗漏了。

    示例列表:

    list1 = ['a', 'b', 'c']
    list2 = ['m', 'n', 'o']
    list3 = ['x', 'y', 'z']
    list4 = ['q', 'r', 's']
    

    示例仅需要2行的输出,但我希望所有组合:

    combos = [[['a', 'm', 'x'], 'q'], 
              [['a', 'n', 'r'], 'z'], 
              [['s', 'z', 'o'], 'a']]
        
    df = pd.DataFrame(combos, columns = ['combo', 'extra'])
    

    重要的是,“额外”应该从所有列表中进行采样。

    我目前不确定顺序对我来说是否对组合重要,但如果代码对排列很容易解释,那也很棒。非常感谢。

    1 回复  |  直到 2 年前
        1
  •  1
  •   C.Nivs    2 年前

    你可能想要 itertools.product

    from itertools import product
    
    ls = [list1, list2, list3, list4]
    
    for *a, b in product(*ls):
        print(a, b)
    
    ['a', 'm', 'x'] q
    ['a', 'm', 'x'] r
    ['a', 'm', 'x'] s
    ['a', 'm', 'y'] q
    ['a', 'm', 'y'] r
    

    特别是收集它们:

    df = pd.DataFrame(
        [[a, b] for *a, b in product(*ls)], 
        columns=['combo', 'extra']
    )
    

    编辑

    要交换哪个是“额外的”,您需要进行置换 ls :

    from itertools import permutations, product
    
    
    ls = [list1, list2, list3, list4]
    
    for l in permutations(ls):
        for *a, b in product(*l):
            print(a, b)