【问题标题】:How to generate a cartesian product with a dependent cartesian product如何生成具有依赖笛卡尔积的笛卡尔积
【发布时间】:2021-05-06 13:48:10
【问题描述】:

如何使用 itertools 或类似工具获得以下预期结果? itertools.product 与 Boolean x Boolean x Range x Range 会产生许多不希望的结果。

A1, A2 应仅在 use_A is True 的情况下迭代

B1, B2 应仅在 use_B is True 的情况下迭代

它必须是最有效的方式,因为完整的product_config 有超过 50 亿种不同的组合。

product_config = {
    'use_A': [False, True],
    'A1': range(3),
    'A2': range(3),
    'use_B': [False, True],
    'B1': range(3),
    'B2': range(3)
}

# Desired results:
res = [
    {'use_A': False, 'use_B': False},
    {'use_A': True, 'A1': 0, 'A2': 0, 'use_B': False},
    {'use_A': True, 'A1': 0, 'A2': 1, 'use_B': False},
    {'use_A': True, 'A1': 0, 'A2': 2, 'use_B': False},
    {'use_A': True, 'A1': 1, 'A2': 0, 'use_B': False},
    {'use_A': True, 'A1': 1, 'A2': 1, 'use_B': False},
    {'use_A': True, 'A1': 1, 'A2': 2, 'use_B': False},
    {'use_A': True, 'A1': 2, 'A2': 0, 'use_B': False},
    {'use_A': True, 'A1': 2, 'A2': 1, 'use_B': False},
    {'use_A': True, 'A1': 2, 'A2': 2, 'use_B': False},
    {'use_A': True, 'A1': 0, 'A2': 0, 'use_B': True, 'B1': 0, 'B2': 0},
    {'use_A': True, 'A1': 0, 'A2': 1, 'use_B': True, 'B1': 0, 'B2': 1},
    {'use_A': True, 'A1': 0, 'A2': 2, 'use_B': True, 'B1': 0, 'B2': 2},
    {'use_A': True, 'A1': 1, 'A2': 0, 'use_B': True, 'B1': 1, 'B2': 0},
    {'use_A': True, 'A1': 1, 'A2': 1, 'use_B': True, 'B1': 1, 'B2': 1},
    {'use_A': True, 'A1': 1, 'A2': 2, 'use_B': True, 'B1': 1, 'B2': 2},
    {'use_A': True, 'A1': 2, 'A2': 0, 'use_B': True, 'B1': 2, 'B2': 0},
    {'use_A': True, 'A1': 2, 'A2': 1, 'use_B': True, 'B1': 2, 'B2': 1},
    {'use_A': True, 'A1': 2, 'A2': 2, 'use_B': True, 'B1': 2, 'B2': 2},
    {'use_A': False, 'use_B': True, 'B1': 0, 'B2': 0},
    {'use_A': False, 'use_B': True, 'B1': 0, 'B2': 1},
    {'use_A': False, 'use_B': True, 'B1': 0, 'B2': 2},
    {'use_A': False, 'use_B': True, 'B1': 1, 'B2': 0},
    {'use_A': False, 'use_B': True, 'B1': 1, 'B2': 1},
    {'use_A': False, 'use_B': True, 'B1': 1, 'B2': 2},
    {'use_A': False, 'use_B': True, 'B1': 2, 'B2': 0},
    {'use_A': False, 'use_B': True, 'B1': 2, 'B2': 1},
    {'use_A': False, 'use_B': True, 'B1': 2, 'B2': 2},
]

【问题讨论】:

    标签: python itertools cartesian-product


    【解决方案1】:

    使用itertools,我们可以使用以下内容:

    import itertools
    import pprint
    
    pp = pprint.PrettyPrinter(indent=4)
    b1 = [False, True]
    t1 = itertools.product(b1, b1)
    res = []
    for t in t1:
        i1 = itertools.product(range(3), range(3))
        for i in i1:
            rdict = {'use_A': t[0], 'use_B': t[1]}
            if not t[0] and not t[1]:
                res.append(rdict)
                break
            if t[0]:
                rdict['A1'] = i[0]
                rdict['A2'] = i[1]
            if t[1]:
                rdict['B1'] = i[0]
                rdict['B2'] = i[1]
            res.append(rdict)
    pp.pprint(res)
    

    输出

    [   {'use_A': False, 'use_B': False},
        {'B1': 0, 'B2': 0, 'use_A': False, 'use_B': True},
        {'B1': 0, 'B2': 1, 'use_A': False, 'use_B': True},
        {'B1': 0, 'B2': 2, 'use_A': False, 'use_B': True},
        {'B1': 1, 'B2': 0, 'use_A': False, 'use_B': True},
        {'B1': 1, 'B2': 1, 'use_A': False, 'use_B': True},
        {'B1': 1, 'B2': 2, 'use_A': False, 'use_B': True},
        {'B1': 2, 'B2': 0, 'use_A': False, 'use_B': True},
        {'B1': 2, 'B2': 1, 'use_A': False, 'use_B': True},
        {'B1': 2, 'B2': 2, 'use_A': False, 'use_B': True},
        {'A1': 0, 'A2': 0, 'use_A': True, 'use_B': False},
        {'A1': 0, 'A2': 1, 'use_A': True, 'use_B': False},
        {'A1': 0, 'A2': 2, 'use_A': True, 'use_B': False},
        {'A1': 1, 'A2': 0, 'use_A': True, 'use_B': False},
        {'A1': 1, 'A2': 1, 'use_A': True, 'use_B': False},
        {'A1': 1, 'A2': 2, 'use_A': True, 'use_B': False},
        {'A1': 2, 'A2': 0, 'use_A': True, 'use_B': False},
        {'A1': 2, 'A2': 1, 'use_A': True, 'use_B': False},
        {'A1': 2, 'A2': 2, 'use_A': True, 'use_B': False},
        {'A1': 0, 'A2': 0, 'B1': 0, 'B2': 0, 'use_A': True, 'use_B': True},
        {'A1': 0, 'A2': 1, 'B1': 0, 'B2': 1, 'use_A': True, 'use_B': True},
        {'A1': 0, 'A2': 2, 'B1': 0, 'B2': 2, 'use_A': True, 'use_B': True},
        {'A1': 1, 'A2': 0, 'B1': 1, 'B2': 0, 'use_A': True, 'use_B': True},
        {'A1': 1, 'A2': 1, 'B1': 1, 'B2': 1, 'use_A': True, 'use_B': True},
        {'A1': 1, 'A2': 2, 'B1': 1, 'B2': 2, 'use_A': True, 'use_B': True},
        {'A1': 2, 'A2': 0, 'B1': 2, 'B2': 0, 'use_A': True, 'use_B': True},
        {'A1': 2, 'A2': 1, 'B1': 2, 'B2': 1, 'use_A': True, 'use_B': True},
        {'A1': 2, 'A2': 2, 'B1': 2, 'B2': 2, 'use_A': True, 'use_B': True}]
    

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多