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}}

つまり、置換ルールの場合は、ではなくlevelspecReplace (3 番目の引数) を使用するか、意図した要素にのみ一致するようにパターンを制限する必要があります。(さらに、名前付きパターンを使用してこれらのシンボルを適切にローカライズする場合は、代わりに使用することを忘れないでください。)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 に答える