给出以下列表:
{a + b, c + d + e, - a + b, a - b, - c - d - e}
我想得到结果:
{a + b, a - b, c + d + e}
澄清:我想以这样一种方式转换第一个列表,即每个元素中的第一个术语被标准化为一个加号,并通过乘以{{{}来丢弃可以从最终结果中获得的任何元素。 1}}。
我尝试了-1
和Collect[]
以及其他一些看起来很远的功能,就像他们可以做我需要的那样,但他们从不接触减号......
非常感谢任何帮助。
答案 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 - 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, 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}}