mathematica中的特殊Tally函数

时间:2011-03-15 01:29:43

标签: wolfram-mathematica

我想知道如何编写一个特殊的Tally函数,它将以下列表{{{1,0},{2,1,3}},{{1,1},{0,1,1}},{{2,1,2},{3,2}},{{1,0},{2,1}}}视为:{/ p>

  1. 只要尺寸匹配,就相当于。例如,{{1,0},{2,1,3}}{{1,1},{0,1,1}}是等效的,但不是{{1,0},{2,1}}
  2. 订购也没关系。例如,{{1,0},{2,1,3}}{{2,1,2},{3,2}}是等效的。
  3. 级别1列表的元素可以是艺术嵌套的。我该如何编写这样的函数?

    非常感谢。

3 个答案:

答案 0 :(得分:7)

(1)将所有整数替换为0。 (2)排在第一级。 这为列表中的每个类提供了独特的代表。

 ll2 = Map[Sort, ll /. aa_Integer -> 0]

Out [9] = {{{0,0},{0,0,0}},{{0,0},{0,0,0}},{{0,0}},{0 ,0,    0}},{{0,0},{0,0}}}

Tally[ll2]

Out [10] = {{{{0,0},{0,0,0}},3},{{{0,0},{0,0}},1}}

Daniel Lichtblau Wolfram Research

答案 1 :(得分:4)

与@ Daniel的答案非常相似,但保留了每个班级的成员:

In[9]:= Tally[list, (Sort[Length /@ #] == Sort[Length /@ #2]) &]

Out[9]= {{{{1, 0}, {2, 1, 3}}, 3}, {{{1, 0}, {2, 1}}, 1}}

答案 2 :(得分:3)

使用SelectEquivalents

SelectEquivalents[list, Dimensions, #&, {#2[[1]], Length@#2}&]

Michael's answer

相同
SelectEquivalents[list, Dimensions, #&, {#2[[1]] /. _Integer -> 0, Length@#2}&]

给出了Daniel's answer。或者,我个人最喜欢的

SelectEquivalents[list, Dimensions, #&, {#1, Length@#2}&]

给出了

{{{2},3}, {{2,2}, 1}}

但是,这揭示了使用Dimension时的一个缺陷,因为当子列表具有不同的dims时它不知道要报告什么,所以如果我们用Dimension替换Sort@Map[Length,#,{1,Infinity}]&,我们可以开始处理任意维度。这给了

{{{2, 3}, 3}, {{2, 2}, 1}}

因此,揭示了每个子列表的维度。这并没有排在第一个维度之下,我也看不出它是如何立即修复的。