我想获得List中找到的不同值的数量。
例如:
列表a={1,2,3,4,5}
的输出为5,而b={1,1,1,2,2}
的输出为2。
答案 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]
顺便说一句:请注意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]}]
小心!记录图!
答案 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]]
会做到这一点。根据您将要执行的其他操作,您可以使用Union
或Tally
代替DeleteDuplicates
。
答案 3 :(得分:1)
CountDistinct[a]
也可以做到这一点,这是Mathematica 10.0中引入的一个函数,一个等效于
的函数Length[DeleteDuplicates[a]]