gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:45:11 25 4
gpt4 key购买 nike

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

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

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

但要点是,一旦你解构了列表,使用什么来转换不同的部分(再次规则,或函数等)并不重要,此时你并不局限于仅使用规则。

关于wolfram-mathematica - Mathematica 中的列表元素模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com