python - 如何生成具有依赖笛卡尔积的笛卡尔积
问题描述
如何使用 itertools 或类似工具获得以下预期结果?itertools.product
使用 Boolean x Boolean x Range x Range 会产生许多不希望的结果。
A1, A2
仅应在以下情况下进行迭代use_A is True
B1, B2
仅应在以下情况下进行迭代use_B is True
它必须是最有效的方式,因为 fullproduct_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},
]
解决方案
我们可以使用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}]
推荐阅读
- single-sign-on - Edge Chromium 不会将 SAML 数据 http 发布到 IEMode 用户访问 URL
- python - 检查 Discord 机器人是否在线
- cmake - 使用正确的包含目录来构建 LLVM 通行证
- java - 如何捕获和传播通配符类型参数?
- javascript - 单击时手风琴滚动到顶部?
- discord.py - discord.py 创建一个机器人,当特定用户加入语音频道时,该机器人会在文本频道中发送专门的预设消息
- qt - 如何在qmake中指定repc的输出路径?
- django - Django,当我调用扩展模板时丢失了模板的变量
- javascript - 我的幻灯片图像在彼此之上????HTML,JS,CSS
- reactjs - 如何修复 npm ERR!代码 ELIFECYCLE 退出状态 130