求助:如何为Python字典组合添加条件过滤逻辑
基于条件生成符合规则的字典组合
需求说明
主字典定义了各字段的可选值:
payload = { "type": ["sedan","suv"], "name": ["car1","car2"], "color": ["black","white","green"], "version": ["mid","top"], "model": ["2","5","13"], }
条件规则:
color_rules = { "car1": ["black","green"], "car2":["white"] } model_rules = { "mid":["5"], "top":["13","5"] }
规则细节:
- 当
name为"car1"时,color只能选"black"或"green"; - 当
name为"car2"时,color只能选"white"; - 当
version为"mid"时,model只能选"5"; - 当
version为"top"时,model可选"13"或"5"。
预期输出:
[ {'type': 'sedan', 'name': 'car1', 'color': 'black', 'version': 'mid', 'model': '5'}, {'type': 'sedan', 'name': 'car1', 'color': 'black', 'version': 'top', 'model': '5'}, {'type': 'sedan', 'name': 'car1', 'color': 'black', 'version': 'top', 'model': '13'}, {'type': 'sedan', 'name': 'car1', 'color': 'green', 'version': 'mid', 'model': '5'}, {'type': 'sedan', 'name': 'car1', 'color': 'green', 'version': 'top', 'model': '5'}, {'type': 'sedan', 'name': 'car1', 'color': 'green', 'version': 'top', 'model': '13'}, {'type': 'suv', 'name': 'car1', 'color': 'black', 'version': 'top', 'model': '5'}, {'type': 'suv', 'name': 'car1', 'color': 'black', 'version': 'top', 'model': '13'}, {'type': 'suv', 'name': 'car1', 'color': 'black', 'version': 'mid', 'model': '5'}, {'type': 'suv', 'name': 'car1', 'color': 'green', 'version': 'top', 'model': '5'}, {'type': 'suv', 'name': 'car1', 'color': 'green', 'version': 'top', 'model': '13'}, {'type': 'suv', 'name': 'car1', 'color': 'green', 'version': 'mid', 'model': '5'}, {'type': 'sedan', 'name': 'car2', 'color': 'white', 'version': 'mid', 'model': '5'}, {'type': 'sedan', 'name': 'car2', 'color': 'white', 'version': 'top', 'model': '5'}, {'type': 'sedan', 'name': 'car2', 'color': 'white', 'version': 'top', 'model': '13'}, {'type': 'suv', 'name': 'car2', 'color': 'white', 'version': 'mid', 'model': '5'}, {'type': 'suv', 'name': 'car2', 'color': 'white', 'version': 'top', 'model': '5'}, {'type': 'suv', 'name': 'car2', 'color': 'white', 'version': 'top', 'model': '13'} ]
现有代码(会生成所有组合,未加条件):
import itertools payload = { "type": ["sedan","suv"], "name": ["car1","car2"], "color": ["black","white","green"], "version": ["mid","top"], "model": ["2","5","13"], } color_rules = { "car1": ["black","green"], "car2":["white"] } model_rules = { "mid":["5"], "top":["13","5"] } output = [dict(zip(payload.keys(), a)) for a in itertools.product(*payload.values())] print(output)
修改方案
在生成所有组合后,添加条件过滤逻辑,只保留符合规则的组合:
import itertools payload = { "type": ["sedan","suv"], "name": ["car1","car2"], "color": ["black","white","green"], "version": ["mid","top"], "model": ["2","5","13"], } color_rules = { "car1": ["black","green"], "car2":["white"] } model_rules = { "mid":["5"], "top":["13","5"] } output = [] # 遍历所有生成的组合 for item in itertools.product(*payload.values()): combo = dict(zip(payload.keys(), item)) # 检查颜色是否符合对应name的规则 if combo["color"] not in color_rules[combo["name"]]: continue # 检查型号是否符合对应version的规则 if combo["model"] not in model_rules[combo["version"]]: continue # 符合所有规则则加入输出列表 output.append(combo) # 打印最终结果 for elem in output: print(elem)
逻辑说明
- 先通过
itertools.product生成所有字段的笛卡尔积组合; - 将每个组合转换为字典后,依次校验两个规则:
- 根据当前组合的
name值,匹配对应颜色规则,不符合则跳过该组合; - 根据当前组合的
version值,匹配对应型号规则,不符合则跳过该组合;
- 根据当前组合的
- 仅保留同时满足两个规则的组合,最终得到符合要求的输出列表。
内容的提问来源于stack exchange,提问作者user20035511
相关产品推荐
相关产品推荐

