Count how many different values a list takes in Mathematica

后端 未结 4 1575
梦谈多话
梦谈多话 2021-02-08 02:45

I would like to get the number of different values found in a List.

For example:

The output for the List a={1,2,3,4,5} would be 5 whereas it would b

相关标签:
4条回答
  • 2021-02-08 03:00

    Just for amusement, all the following commands also give the desired result:

    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, # &]
    

    And many more, of course.

    Edit

    Here is a little timing experiment (not serious)

    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

    BTW: Note the difference between BinLists[ ] and BinCounts[ ]

    Edit

    A more detailed view of 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]}]
    

    Beware! Log Plot!

    enter image description here

    0 讨论(0)
  • 2021-02-08 03:05
    Length[DeleteDuplicates[a]]
    

    would do the trick. Depending on what else you're going to do, you could use Union or Tally instead of DeleteDuplicates.

    0 讨论(0)
  • 2021-02-08 03:21

    Use DeleteDuplicates (or Union in older versions) to remove duplicate elements. You can then count the elements in the returned list.

    In[8]:= Length[DeleteDuplicates[a]]
    Out[8]= 5
    
    In[9]:= Length[DeleteDuplicates[b]]
    Out[9]= 2
    
    0 讨论(0)
  • 2021-02-08 03:22
    CountDistinct[a]
    

    would also do the trick, which is a function introduced in Mathematica 10.0, a function equivalent to

    Length[DeleteDuplicates[a]]
    
    0 讨论(0)
提交回复
热议问题