You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建表达式集合时如何避免交换运算符的重复表达式?

解决交换运算符表达式去重的思路与代码实现

嘿,这个问题我之前帮不少开发者处理过,核心就是对交换运算符只遍历「无序对」,而非交换运算符遍历所有「有序对」。咱们一步步拆解:

核心逻辑区分

  • 交换运算符(+、*):因为a+b和b+a数学等价,所以只需要生成一次。这里用索引控制最稳妥——遍历元素时,让第二个元素的索引不小于第一个元素的索引,就能避免反向组合。
  • 非交换运算符(-、/):a-b和b-a是完全不同的表达式,所以需要遍历所有可能的有序元素对。

完整代码实现

primary_descriptors = ['a', 'b']
commutative_operators = ['+', '*']
non_commutative_operators = ['-', '/']
expressions = []

# 处理交换运算符:生成无重复的无序对表达式
for i in range(len(primary_descriptors)):
    x = primary_descriptors[i]
    # j从i开始,确保不会生成反向的交换表达式
    for j in range(i, len(primary_descriptors)):
        y = primary_descriptors[j]
        for op in commutative_operators:
            expressions.append(f"{x}{op}{y}")

# 处理非交换运算符:生成所有有序对表达式
for x in primary_descriptors:
    for y in primary_descriptors:
        # 如果不需要x和y相同的表达式(比如a-a、a/a),可以加个if x != y判断
        for op in non_commutative_operators:
            expressions.append(f"{x}{op}{y}")

# 可选:去重(如果primary_descriptors有重复元素时有用,唯一元素可省略)
expressions = list(dict.fromkeys(expressions))
print(expressions)

代码说明

  1. 交换运算符部分:用索引i和j控制,j从i开始遍历,这样对于['a','b'],只会生成a+a、a+b、b+b,不会出现b+a这类冗余表达式。
  2. 非交换运算符部分:遍历所有x和y的组合,所以会生成a-b、b-a、a/a、b/b等所有符合要求的表达式。
  3. 去重处理:用dict.fromkeys比set更稳妥,能保留表达式的生成顺序,同时去掉重复项。

内容的提问来源于stack exchange,提问作者anotherone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:24:08