Ale*_*lec 4 functional-programming wolfram-mathematica list
这源于一个相关的讨论,如何使用Mathematica中的函数编程减去列表中的特定元素?
如何轻松计算列表中值之间的百分比差异?
链接的问题使用差异来轻松计算列表中连续元素之间的绝对差异.无论内置的差异函数容易出现这个特殊问题,它仍然存在如何执行不同操作的问题.
正如我之前提到的,我现在希望计算百分比差异.给定一个元素列表{value1, value2, ..., valueN},如何执行类似于(value2-value1)/value1所述列表的操作?
我已经尝试找到一种方法来使用Slot或SlotSequence隔离特定元素,然后将自定义函数应用于它们.这是做这样事情的最有效方式(假设有一种方法可以隔离元素并对它们执行操作)?
有一些自然的方法可以做到这一点.
您可以使用分区形成"减少百分比"功能的参数列表:
In[3]:= list = {a, b, c, d, e};
In[4]:= Partition[list, 2, 1]
Out[4]= {{a, b}, {b, c}, {c, d}, {d, e}}
Run Code Online (Sandbox Code Playgroud)
然后你可以将函数应用于这些:
In[6]:= f @@@ Partition[list, 2, 1]
Out[6]= {f[a, b], f[b, c], f[c, d], f[d, e]}
Run Code Online (Sandbox Code Playgroud)
使用百分比减少功能:
In[7]:= PercentDecrease[a_, b_] := (b - a)/a
In[8]:= PercentDecrease @@@ Partition[list, 2, 1]
Out[8]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}
Run Code Online (Sandbox Code Playgroud)
(阅读申请时的"更多信息"说明,阅读@@@ .)
您可以使用Most和Rest来形成第一个和第二个参数的列表,然后使用MapThread组合它们,而不是分区:
In[14]:= MapThread[PercentDecrease, {Most[list], Rest[list]}]
Out[14]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}
Run Code Online (Sandbox Code Playgroud)
另一种方法是通过两个步骤形成您的操作(减法和除法),如下所示:
In[10]:= Differences[list] / Most[list]
Out[10]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}
Run Code Online (Sandbox Code Playgroud)
除法运算(/)线程在两个列表Differences[list]和Most[list]之间.