2

考虑以下:

    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

4

2 回答 2

3

首先应该注意的是,这个特定的操作最好用Reverse[x, {2}]

Reverse[{{a, b}, {c, d}, {e, f}}, {2}]
{{b, a}, {d, c}, {f, e}}

也就是说,对于替换规则,您应该使用Replacelevelspec 第三个参数)而不是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}
于 2012-08-18T08:43:30.237 回答
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

如果您事先知道列表中的所有元素都是列表,也可以正常工作。

于 2012-08-18T06:20:08.067 回答