考虑以下事项:
rule={x_, y_} -> {y, x};
{{a, b}, {c, d}, {e, f}} /. rule
{{a, b}, {c, d}} /. rule
{{a, b}} /. {x_, y_} -> rule
输出是:
{{b, a}, {d, c}, {f, e}}
{{c, d}, {a, b}}
{{b, a}}
但是假设初始列表的长度未知。我应该如何重写我的规则,以便无论输入列表的长度如何,即长度为2时,子列表中的各个元素都是相反的。
答案 0 :(得分:3)
首先应该注意的是,使用Reverse[x, {2}]
Reverse[{{a, b}, {c, d}, {e, f}}, {2}]
{{b, a}, {d, c}, {f, e}}
也就是说,对于替换规则,您应该使用Replace
和 levelspec (第三个参数)而不是ReplaceAll
,或限制您的模式以使其仅匹配在你想要的元素上。 (另外,在使用命名模式正确本地化这些符号时,请记住使用:>
而不是->
。)
Replace[{{a, b}, {c, d}}, {x_, y_} :> {y, x}, {1}]
{{b, a}, {d, c}}
可在样本中使用/.
的限制模式示例:
{{a, b}, {c, d}} /. {x : Except[_List], y_} :> {y, x}
{{a, b}, {c, d}} /. {x_Symbol, y_} :> {y, x}
{{a, b}, {c, d}} /. {x_, y_?AtomQ} :> {y, x}
答案 1 :(得分:1)
这是一种递归方式:
ClearAll[rule1]
rule1 = {z_, y___} :> {z /. x_List :> Reverse[x], Sequence @@ ({y} /. rule1)}
结果如何:
{{1, 2, 3}, 2, {1, {2, 3}}, 4, head[x]} /. rule1
Out[]= {{3, 2, 1}, 2, {{2, 3}, 1}, 4, head[x]}
虽然您也可以这样做:
ClearAll[rule2]
rule2 = x_List :> (# /. z_List :> Reverse[z] &) /@ x
或者,只是
rule3 = x_List :> Reverse /@ x
如果您事先知道列表中的所有元素都是列表,也会起作用。