计算Mathematica中列表所需的不同值

时间:2011-05-27 15:52:19

标签: count wolfram-mathematica

我想获得List中找到的不同值的数量。

例如:

列表a={1,2,3,4,5}的输出为5,而b={1,1,1,2,2}的输出为2。

4 个答案:

答案 0 :(得分:14)

为了娱乐,以下所​​有命令也会给出所需的结果:

Length@Gather@l

Length@Union@l

Length@Tally@l

Count[BinCounts@l, Except@0]

Count[BinLists@l, Except@{}]

Length@Split@Sort@l

Length@GatherBy[l, # &]

Length@Split@SortBy[l, # &]

当然还有更多。

修改

这是一个小时间实验(不严重)

l = RandomInteger[{1, 10^2}, 10^7];
t2[x_] := {Timing[x], ToString[HoldForm@x]};
SetAttributes[t2, HoldAll]
Grid[Reverse /@
  {t2[Length@DeleteDuplicates[l]],
   t2[Length@Tally[l]],
   t2[Length@Gather[l]],
   t2[Count[BinCounts[l], Except@0]],
   t2[Length@Union[l]],
   t2[Length@Split@Sort@l],
   t2[Count[BinLists[l], Except@0]]},
 Frame -> All]

enter image description here

顺便说一句:请注意BinLists[ ]BinCounts[ ]

之间的区别

修改

DeleteDuplicates vs Tally

的更详细视图
t = Timing;
ListLinePlot@Transpose@
  Table[l = RandomInteger[{1, 10^i}, 10^7];
   {Log@First@t@Length@DeleteDuplicates@l,
    Log@First@t@Length@Tally@l},
   {i, Range[7]}]

小心!记录图!

enter image description here

答案 1 :(得分:13)

使用DeleteDuplicates(或旧版本中的Union)删除重复元素。然后,您可以计算返回列表中的元素。

In[8]:= Length[DeleteDuplicates[a]]
Out[8]= 5

In[9]:= Length[DeleteDuplicates[b]]
Out[9]= 2

答案 2 :(得分:9)

Length[DeleteDuplicates[a]]

会做到这一点。根据您将要执行的其他操作,您可以使用UnionTally代替DeleteDuplicates

答案 3 :(得分:1)

CountDistinct[a]

也可以做到这一点,这是Mathematica 10.0中引入的一个函数,一个等效于

的函数
Length[DeleteDuplicates[a]]