Wolfram mathematica Mathematica中的列表元素模式匹配

Wolfram mathematica Mathematica中的列表元素模式匹配,wolfram-mathematica,Wolfram Mathematica,以下模式仅与第一个元素匹配 {a, b, c, d, e} /. {start : ___, x_, stop : ___} :> {start, 1, stop} 如何使其与所有列表元素匹配 更新: 我的目标稍微扩展一点的版本是为列表的不同元素提供一组三个转换规则。一个规则应该适用于第一个元素,一个用于最后一个元素,另一个规则适用于中间的每个元素。下面是一个例子: {a, b, c, d, e} /. {most : Repeated[_], x_} -> {most,

以下模式仅与第一个元素匹配

{a, b, c, d, e} /. {start : ___, x_, stop : ___} :> {start, 1, stop}
如何使其与所有列表元素匹配

更新:

我的目标稍微扩展一点的版本是为列表的不同元素提供一组三个转换规则。一个规则应该适用于第一个元素,一个用于最后一个元素,另一个规则适用于中间的每个元素。下面是一个例子:

{a, b, c, d, e} /. {most : Repeated[_], x_} -> 
   {most, "Last"} /. {x_, rest : Repeated[_]} -> {"First", rest}
这些是第一个和最后一个元素的规则。现在我需要中间所有元素的规则。因此,我提出了最初的问题


我可能选择了一个错误的方法,因为我找不到一个简单的方法来实现这一点。有没有可能用规则做到这一点

你的问题有点不清楚。猜猜你的意思-这将迫使进行最长的比赛:

In[2]:= {a, b, c, d,  e} /. {start : Longest[___], x_, stop : ___} :> {start, 1, stop}

Out[2]= {a, b, c, d, 1}
虽然这将给出规则应用的所有可能结果,而不仅仅是第一个匹配的结果:

In[3]:= ReplaceList[{a, b, c, d, e}, {start : ___, x_, stop : ___} :> {start, 1, stop}]

Out[3]= {{1, b, c, d, e}, {a, 1, c, d, e}, {a, b, 1, d, e}, {a, b, c, 1, e}, {a, b, c, d, 1}}

编辑:

对于这个问题的一个更精炼的版本,一般的答案是

{a, b, c, d, e} /. {start_, x__, end_} :> {f[start], g[x], h[end]},
其中,通过指定函数
f、g、h
,可以分别对第一个、最后一个和中间元素进行任何类型的转换。有时,您可以在规则中使用规则,使其更加简洁,例如:

In[7]:= {a, b, c, d, e} /. {start_, x__, end_} :> {start /. _ -> "First", 
                   Sequence @@ Replace[{x}, _ -> 1, 1], end /. _ -> "Last"}

Out[7]= {"First", 1, 1, 1, "Last"}
但主要的一点是,一旦您对列表进行了分解,您使用什么来转换不同的部分(再次转换规则或函数等)并不重要,您不仅限于在该点上使用规则。

您可以执行以下操作:

list = Range[10]
list /. {first_, middle__, last_} -> {f[first], g[middle], h[last]}  
出去

或者,如果您定义:

g[x_, y__] = {g[x], g[y]} /. List -> Sequence 
那么结果是

{f[1], g[2], g[3], g[4], g[5], g[6], g[7], g[8], g[9], h[10]}

实际上我想得到{1,1,1,1,1}。因此,该规则将应用于所有列表元素。@Max:那么,这只是一个错误的模式。像您这样的模式用于一些不同的目的,即当模式必须捕获元素之间的一些非本地相互依赖关系时。这样的模式通常也会导致很大的开销,有时也很难正确处理。因此,必须节约使用。在你的例子中,考虑到你的目标,列表元素是非常独立的,所以我会这样做:
Replace[{a,b,c,d,e},{u->1,1]
@Leonid Shifrin好吧,这不是我真正的目标。这只是一个简单的例子来演示我希望模式如何工作。实际上我想要的是有一套3种不同的转换规则。一个元素用于第一个元素,一个用于最后一个元素,另一个用于中间元素。我对第一个和最后一个元素的模式没有问题。但是我不能为中间元素发明一种模式。@麦克斯,那么你在问题中没有明确说明你的目标,至少我发现很难将你最初的要求与你最新的表述联系起来。也许,这更接近您所需要的:
{a,b,c,d,e}/。{start,x,end}:>{f[start],g[x],h[end]}
。请注意,应该在第一个和最后一个元素中使用一个下划线,以将它们挑出。然后可以指定
f、g、h
是什么,特别是
g
可以将序列中的每个元素转换为
1
并返回ones@Leonid希夫林。是否可以这样做,即g[]一次只取一个中间元素,而不是同时取所有元素?
{f[1], g[2], g[3], g[4], g[5], g[6], g[7], g[8], g[9], h[10]}