拉出减号以获得统一列表?

时间:2011-06-15 15:55:50

标签: wolfram-mathematica

给出以下列表:

{a + b, c + d + e, - a + b, a - b, - c - d - e}

我想得到结果:

{a + b, a - b, c + d + e}

澄清:我想以这样一种方式转换第一个列表,即每个元素中的第一个术语被标准化为一个加号,并通过乘以{{{}来丢弃可以从最终结果中获得的任何元素。 1}}。

我尝试了-1Collect[]以及其他一些看起来很远的功能,就像他们可以做我需要的那样,但他们从不接触减号......

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:10)

使用FactoredTermsList

In[5]:= FactorTermsList /@ {a + b, c + d + e, -a + b, 
  a - b, -c - d - e}

Out[5]= {{1, a + b}, {1, c + d + e}, {-1, a - b}, {1, a - b}, {-1, 
  c + d + e}}

In[6]:= DeleteDuplicates[%[[All, 2]]]

Out[6]= {a + b, c + d + e, a - b}

答案 1 :(得分:4)

如果第一个元素的句法符号为负,则将每个替换为负数。然后采取联盟。例如:

ll = {a + b, c + d + e, -a + b, a - b, -c - d - e}

Out[444]= {a + b, c + d + e, -a + b, a - b, -c - d - e}

Union[Map[
  If[Head[#] === Plus && Head[#[[1]]] === Times && 
     NumberQ[#[[1, 1]]] && #[[1, 1]] < 0, Expand[-#], #] &, ll]]

{a - b, a + b, c + d + e}

Daniel Lichtblau

答案 2 :(得分:2)

看起来您想要消除以整数为模的重复元素。至少在这种特殊情况下,以下内容可行:

In[13]:= Union[FullSimplify@Abs[{a + b, c + d + e, -a + b, a - b, -c - d - e}]] /. 
          Abs[x_] :> x

Out[13]= {a - b, a + b, c + d + e}

如果列表中元素的顺序很重要,您可以使用DeleteDuplicates代替Union

答案 3 :(得分:2)

这是一次尝试。

ClearAll[nTerm];
nTerm[t_] := If[MatchQ[t[[1]], Times[-1, _]], -t, t]

旨在映射到列表;将(列表的)单个项目作为输入,如果第一个元素具有负号,则将其替换为负数。因此nTerm[-a + b + c]提供了a - b - cnTerm保留了nTerm[a - b - c]ClearAll[removeElements]; removeElements[lst_] := DeleteDuplicates[lst, (#1 \[Equal] #2) || (#1 \[Equal] -#2) &] 会回复其论点。

接下来,

removeElements[{1, 2, 3, -2, a, -a, "GWB", -"GWB"}]

将列表作为参数,删除可能通过否定从另一个列表元素获取的列表元素:{1, 2, 3, a, "GWB"}给出ClearAll[processList]; processList[lst_] := removeElements[nTerm /@ lst] (!)。最后,

li = {a + b, c + d + e, -a + b, a - b, -c - d - e}; processList[li]

将整批应用于输入列表;因此,{a + b, c + d + e, a - b}给出了{{1}}