专家们的轻量级问题。我无法想象这个替换的正确语法。我有这个清单
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}。我现在更困惑哪个使用:)
答案 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