列表列表中此ReplaceAll的正确语法是什么?

时间:2011-08-01 02:12:17

标签: wolfram-mathematica

专家们的轻量级问题。我无法想象这个替换的正确语法。我有这个清单

Clear[a, b, c, d]
polesList = {{3, {a, b}}, {5, {c, d}}};

它是一个列表的形式,子列表每个都有{order,{x,y}}形式,我想生成这个表单的新列表(x + y)^ order

目前这就是我的工作,其中有效:

((#[[2, 1]] + #[[2, 2]])^#[[1]]) & /@ polesList

(* ----->   {(a + b)^3, (c + d)^5}  *)  

但我一直在努力学习使用ReplaceAll,因为我比纯函数更清楚,因为我可以更好地看到模式,如下所示:

Clear[a, b, c, d, n]
polesList = {{3, {a, b}}, {5, {c, d}}};
ReplaceAll[polesList, {n_, {x_, y_}} :> (x + y)^n]   (*I thought this will work*)

我得到了奇怪的结果,这是

{(5 + c)^3, {(5 + d)^a, (5 + d)^b}}

使用ReplaceAll代替纯函数方法进行此替换的正确语法是什么?

由于

更新:

我发现使用替换而不是ReplaceAll有效,但最后需要说{1}:

Clear[a, b, c, d, n]
polesList = {{3, {a, b}}, {5, {c, d}}};
Replace[polesList, {n_, {x_, y_}} :> (x + y)^n, {1}]

给出了

{(a + b)^3, (c + d)^5}

ReplaceAll最后没有{1}。我现在更困惑哪个使用:)

3 个答案:

答案 0 :(得分:8)

问题是ReplaceAll查看表达式中的所有级别以及与模式的第一个匹配

{n_, {x_, y_}}
表达式{{3, {a, b}}, {5, {c, d}}}中的

{ n=={3, {a, b}}, {x==5, y=={c, d}}}

(如果该表示法清楚)

所以你得到了“奇怪的”结果

(5 + {c,d})^{3, {a, b}} == {5+c, 5+d}^{3, {a, b}} 
== {(5+c)^3, (5+d)^{a, b}} == {(5+c)^3, {(5+d)^a,(5+d)^b}}

最简单的修复,如果n始终为数字,则为

In[2]:= {{3, {a, b}}, {5, {c, d}}} /. {n_?NumericQ, {x_, y_}} :> (x + y)^n
Out[2]= {(a + b)^3, (c + d)^5}

我使用/.的简写ReplaceAll


可能在第1级使用Replace是最佳选择

In[3]:= Replace[{{3, {a, b}}, {5, {c, d}}}, {n_,{x_,y_}}:>(x+y)^n, {1}]
Out[3]= {(a+b)^3,(c+d)^5}

应该与在顶级{0}

中使用的默认替换进行比较
In[4]:= Replace[{{3, {a, b}}, {5, {c, d}}}, {n_,{x_,y_}}:>(x+y)^n]
Out[4]= {(5+c)^3,{(5+d)^a,(5+d)^b}}

答案 1 :(得分:8)

问题是ReplaceAll在查找替换时会检查表达式的所有级别。整个表达式匹配模式{n_, {x_, y_}},其中:

n匹配{3, {a, b}}

x匹配5

y匹配{c, d}

所以你最终会得到(5 + {c , d}) ^ {3, {a, b}},它会根据你看到的结果进行评估。

有几种方法可以解决这个问题。首先,您可以更改模式,使其与最外面的列表不匹配。例如,如果n值始终为整数,则可以使用:

ReplaceAll[polesList, {n_Integer, {x_, y_}} :> (x + y)^n]

或者,您可以使用Replace代替ReplaceAll,并将模式限制为仅匹配第一级:

Replace[polesList, {n_, {x_, y_}} :> (x + y)^n, {1}]

我发现将替换规则应用于列表的第一级非常常见。碰巧的是,Cases默认情况下仅在该级别上运行。因此,当我知道所有元素都与模式匹配时,我发现自己经常使用Cases进行第一级替换:

Cases[polesList, {n_, {x_, y_}} :> (x + y)^n]

这最后一个表达式是我可能会编写所需的替换。但请记住,如果所有元素与模式匹配,那么Cases方法将从结果中删除不匹配。

答案 2 :(得分:8)

您还可以将ReplaceAll[ ]与Map:

一起使用
Map[ReplaceAll[#, {n_, {x_, y_}} :> (x + y)^n] &, polesList]

或(越来越多地使用短片)

ReplaceAll[#, {n_, {x_, y_}} :> (x + y)^n] & /@ polesList

# /. {n_, {x_, y_}} :> (x + y)^n & /@ polesList