在Mathematica中列出元素模式匹配

时间:2011-01-22 19:02:25

标签: wolfram-mathematica

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

{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}

这是第一个和最后一个元素的规则。现在我需要中间所有元素的规则。因此,我原来的问题。

我可能选择了一种错误的方法,因为我无法找到一种直接的方法来做到这一点。是否可以通过规则执行此操作?

2 个答案:

答案 0 :(得分:4)

你的问题有点不清楚。只是猜测你的意思 - 这将迫使最长的匹配:

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}}

HTH

编辑:

回答问题的更精炼版本,通用答案将是

{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"}

但重点是,一旦你对列表进行了解构,你使用什么来转换不同的部分 - 规则,或者函数等 - 并不重要 - 你不仅限于在那一点上使用规则。 / p>

答案 1 :(得分:2)

您可以这样做:

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

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

或者如果您定义:

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]}