Mathematica中的规则行为和初始列表的长度

时间:2012-08-17 22:35:03

标签: list wolfram-mathematica rules

考虑以下事项:

    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时,子列表中的各个元素都是相反的。

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
如果您事先知道列表中的所有元素都是列表,

也会起作用。