在Mathematica中使用模式进行重新排序

3
尝试做到这一点:
list={{{33, 105, 203, 295}, {34, 106, 204, 296}}, 
      {{21, 135, 201, 333}, {22,136, 202, 334}}}

我想要转换子列表,使得第一个子列表:
{{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_}}

编辑

感谢Leonid的评论,以下内容现在可以正常工作

 list /. {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> 
         {{a,g,f,d}, {e,c,b,h}}

如果有更好的方法,请不要犹豫。


1
只需删除规则右侧的空格:使用a代替a_等。空格通常仅用于规则左侧,而模式变量则用于规则右侧。您的总列表很大吗? - Leonid Shifrin
@Leonid,实际上我的代码中没有空格,但它仍然无法工作。总列表只有48个这样的子列表。谢谢。 - 500
我的意思不是空格,而是下划线字符 _。你的规则应该是 {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> {{a,g,f,d}, {e,c,b,h}} - Leonid Shifrin
你想将其写成解决方案吗? - 500
现在没时间将其概括,让它更普遍有用。除非有人接手,否则明天会做。 - Leonid Shifrin
1个回答

6
正如Leonid所写,但他拒绝将其发布为答案,您的模式在进行更正后可正常工作:
list /. {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> {{a, g, f, d}, {e, c, b, h}}

这是完成此任务最直接的方法,但正如Leonid所写,它并不是最通用的。以下是另一种方法,虽然没有模式,但您可以尝试:

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

orderBy[list, {1, 7, 6, 4, 5, 3, 2, 8}]

这使您可以将重新排序指定为简单的排列,可以手动轻松编写,也可以使用RandomeSample@Range@8生成。

如果您的数据具有更多的形状变化,可以通过不同的Partition参数等进行扩展。


@500 我稍微修改了 orderBy,使其效率显著提高。 - Mr.Wizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接