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

问题描述

| 给出以下列表:
{a + b,c + d + e,- a + b,a - b,- c - d - e}
我想得到的结果是:
{a + b,c + d + e}
需要说明的是:我想对第一个列表进行转换,以使每个元素中的第一个项标准化为加号,并丢弃所有可以从最终结果中获得的元素,并乘以
-1
。 我尝试了
Collect[]
FactorTerms[]
以及其他一些看起来很像我可以做我需要的功能函数,但它们从未碰过负号...。 任何帮助是极大的赞赏。     

解决方法

        使用
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},c + d + e}}

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

Out[6]= {a + b,a - b}
    ,        如果第一个元素的句法符号为负,则将其替换为负。然后参加工会。例:
ll = {a + b,-c - d - e}

Out[444]= {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}
丹尼尔·里奇布劳     ,        看来您想消除以总符号为模的重复元素。至少在此特定情况下,以下将起作用:
In[13]:= Union[FullSimplify@Abs[{a + b,-c - d - e}]] /. 
          Abs[x_] :> x

Out[13]= {a - b,c + d + e}
如果列表中元素的顺序很重要,则可以使用ѭ9代替
Union
。     ,        这是一个尝试。
ClearAll[nTerm];
nTerm[t_] := If[MatchQ[t[[1]],Times[-1,_]],-t,t]
旨在映射到列表上;接受(列表中的)单个项目作为输入,如果第一个元素带有负号,则将其替换为负数。因此
nTerm[-a + b + c]
给出
a - b - c
,而
nTerm
则保持不变:
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,\"GWB\"}
(!)。最后,
ClearAll[processList];
processList[lst_] := removeElements[nTerm /@ lst]
将整个批次应用于输入清单;因此,
li = {a + b,-c - d - e}; processList[li]
等于
{a + b,a - b}