如何从含||(或)、&&(与)的逻辑表达式中提取所有可能组合?
逻辑表达式的组合提取问题与解法
问题描述
给定一组包含逻辑运算符的表达式(||表示逻辑或,&&表示逻辑与):
lst = ['(a || b) && (c && d)', '(e && f) || (g || h)', '(i || j) || k']
需要提取所有可能的逻辑组合并生成新列表,预期结果为:
rsltlst = ['a && c && d', 'b && c && d', 'e && f', 'g', 'h', 'i', 'j', 'k']
也可先针对单个表达式处理,例如输入:
s = '(a || b) && (c && d)'
预期得到两个结果:
sol1 = 'a && c && d' sol2 = 'b && c && d'
解法思路
核心利用逻辑运算的分配律:
(A || B) && C等价于A&&C和B&&C,需要将||的每个子项与其他&&子表达式组合A || B || C等价于单独的A、B、C,直接拆分即可;若子项是&&组合(如e && f),则保留整体作为一个组合项
代码实现
单个表达式处理函数
from itertools import product def process_single_expr(expr): # 优先处理顶层 && 连接的表达式 if '&&' in expr: # 拆分所有 && 连接的子部分 sub_exprs = [p.strip() for p in expr.split('&&')] options = [] for sub in sub_exprs: # 去除子表达式的外层括号 clean_sub = sub.strip('()') # 若子表达式包含 ||,拆分出所有可选项 if '||' in clean_sub: opts = [o.strip() for o in clean_sub.split('||')] options.append(opts) else: options.append([clean_sub.strip()]) # 生成所有笛卡尔积组合,用 && 连接 return [' && '.join(comb) for comb in product(*options)] # 处理顶层 || 连接的表达式 elif '||' in expr: sub_exprs = [p.strip().strip('()') for p in expr.split('||')] result = [] # 递归处理每个子表达式(处理嵌套情况) for sub in sub_exprs: result.extend(process_single_expr(sub)) return result # 单个变量的情况 else: return [expr.strip().strip('()')]
测试单个表达式
s = '(a || b) && (c && d)' print(process_single_expr(s)) # 输出: ['a && c && d', 'b && c && d']
批量处理表达式列表
lst = ['(a || b) && (c && d)', '(e && f) || (g || h)', '(i || j) || k'] rsltlst = [] for expr in lst: rsltlst.extend(process_single_expr(expr)) print(rsltlst) # 输出: ['a && c && d', 'b && c && d', 'e && f', 'g', 'h', 'i', 'j', 'k']
内容的提问来源于stack exchange,提问作者himself
相关产品推荐
相关产品推荐

