在Mathematica中基于相似元素的顺序组合子列表

时间:2016-03-29 00:11:34

标签: wolfram-mathematica

我正在尝试将子列表组合在下面给出的数据列表中:

Data={{{2, 6, 3, 5}, {4, 2, 5, 1}}, {{2, 6, 3, 5}, {6, 4, 7, 3}}, 
      {{8, 12 ,9 ,11}, {12 ,8 , 13, 7}},
      {{10, 13, 11, 14}, {14, 9, 1, 10}};

目标是根据每对是否具有相似的术语来组合子列表,如下所示:

FinalData={{{2,6,5,3},{4,2,5,1},{6,4,7,3}},
       {{8, 12 ,9 ,11}, {12 ,8 , 13, 7}}, 
        {{10, 13, 11, 14}, {14, 9, 1, 10}}};

我尝试使用多种方法解决此问题,例如For循环,while循环,Gather,Union和Select,但仍然卡住了。有人愿意帮助我吗?第一篇文章,我希望得到一些建议!提前谢谢。

2 个答案:

答案 0 :(得分:1)

这再现了你的例子:

Union[Flatten[#, 1]] & /@ GatherBy[data, First]

请注意,这只是第一个子列表相同的分组,Union对结果进行排序。如果你需要更一般的,你应该给出一个更一般的例子。

答案 1 :(得分:1)

Data //. {{h___,{p_,q_},m___,{p_,r_},t___}->{h,{p,q,r},m,t},
          {h___,{p_,q_},m___,{r_,q_},t___}->{h,{p,q,r},m,t}}

搜索您的数据以查找任何列表{p,q}和另一个列表{p,r}并将其转换为{p,q,r}。它还搜索查找任何列表{p,q}和另一个列表{r,q}并将其转换为{p,q,r}。它一遍又一遍地做到这一点,直到没有其他列表匹配。您应该仔细测试,以确保在所有情况下都是正确的。你应该查一下//在文档中也称为ReplaceRepeated,试图了解其工作原理。你也应该查看"三重空白"这是连续三个下划线,并在文档中作为BlankNullSequence来试图理解它是如何工作的。并查看如何将符号放在_或___&#34之前;命名模式"试着理解它是如何工作的。了解所有这些将为您提供编写程序来控制Mathematica的新功能。