使用Mathematica中的模式重新排序

500*_*500 3 design-patterns wolfram-mathematica

试着这样做:

list={{{33, 105, 203, 295}, {34, 106, 204, 296}}, 
      {{21, 135, 201, 333}, {22,136, 202, 334}}}
Run Code Online (Sandbox Code Playgroud)

我想转换子列表,以便第一个:

{{33,105,203,295},{34,106,204,296}}

{{33,204,106,295},{34,106,105,296}}

我不明白以下我做错了什么:

list /. {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> 
        {{a_,g_,f_,d_}, {e_,c_,b_,h_}}
Run Code Online (Sandbox Code Playgroud)

编辑

感谢Leonid的评论,下面现在有效

 list /. {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> 
         {{a,g,f,d}, {e,c,b,h}}
Run Code Online (Sandbox Code Playgroud)

如果有人知道更好的方法,不要犹豫.

Mr.*_*ard 6

正如列昂尼德所写,但拒绝发布作为答案,你的模式一旦纠正就会起作用:

list /. {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> {{a, g, f, d}, {e, c, b, h}}
Run Code Online (Sandbox Code Playgroud)

这是完成这项任务的最直接方式,但正如列昂尼德所写,它并不是最普遍的.这是另一种方式,诚然没有模式,你可能会接近这个:

orderBy[list_, order_] := Partition[Flatten[#][[order]], 4] & /@ list

orderBy[list, {1, 7, 6, 4, 5, 3, 2, 8}]
Run Code Online (Sandbox Code Playgroud)

这允许您将重新排序指定为简单的排列,可以手动编写或生成RandomeSample@Range@8.

如果您的数据具有更多种形状,可以使用不同的Partition参数等进行扩展.