我想知道如何编写一个特殊的Tally函数,它将以下列表{{{1,0},{2,1,3}},{{1,1},{0,1,1}},{{2,1,2},{3,2}},{{1,0},{2,1}}}
视为:{/ p>
{{1,0},{2,1,3}}
和{{1,1},{0,1,1}}
是等效的,但不是{{1,0},{2,1}}
。{{1,0},{2,1,3}}
和{{2,1,2},{3,2}}
是等效的。级别1
列表的元素可以是艺术嵌套的。我该如何编写这样的函数?
非常感谢。
答案 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[list, Dimensions, #&, {#2[[1]], Length@#2}&]
相同
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}}
因此,揭示了每个子列表的维度。这并没有排在第一个维度之下,我也看不出它是如何立即修复的。