如何对含SymPy符号的数组先排序再进行相似元素分组?
解决方案
可以通过排序+分组的组合操作实现需求,具体步骤如下:
1. 排序数组
由于数组中的元素都是y的倍数,我们可以提取每个表达式的系数作为排序依据,确保按系数从小到大排列:
import sympy as smp from itertools import groupby x,y,c,a = smp.symbols('x y c a', real=True) arr = [5*y, 7*y, 2*y,13*y, 7*y, 2*y] # 排序:提取与y相乘的系数作为排序key sorted_arr = sorted(arr, key=lambda expr: expr.as_coeff_Mul()[0])
2. 分组相似元素
使用itertools.groupby对排序后的数组分组,同样以系数作为分组依据(排序后相同元素已连续,可直接分组):
# 分组:将系数相同的元素归为一组 grouped = [] for _, group in groupby(sorted_arr, key=lambda expr: expr.as_coeff_Mul()[0]): grouped.append(list(group)) print(grouped) # 输出:[[2*y, 2*y], [5*y], [7*y, 7*y], [13*y]]
简化写法
也可以将两步合并为一行代码:
grouped = [list(g) for _, g in groupby(sorted(arr, key=lambda e: e.as_coeff_Mul()[0]), key=lambda e: e.as_coeff_Mul()[0])]
关键说明
expr.as_coeff_Mul()[0]用于提取表达式中与y相乘的系数(例如2*y会提取出2),保证排序和分组的判断标准一致。itertools.groupby仅对连续的相同元素分组,因此排序是分组的必要前提。
内容的提问来源于stack exchange,提问作者didem
相关产品推荐
相关产品推荐

