Подсчитайте, сколько разных значений принимает список в Mathematica - PullRequest
11 голосов
/ 27 мая 2011

Я хотел бы получить количество различных значений, найденных в списке.

Например:

Выход для списка a={1,2,3,4,5} будет 5, тогда как для 2b={1,1,1,2,2}.

Ответы [ 4 ]

14 голосов
/ 27 мая 2011

Только для развлечения, все следующие команды также дают желаемый результат:

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 против 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

13 голосов
/ 27 мая 2011

Используйте DeleteDuplicates (или Union в старых версиях), чтобы удалить дубликаты элементов. Затем вы можете сосчитать элементы в возвращенном списке.

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

In[9]:= Length[DeleteDuplicates[b]]
Out[9]= 2
9 голосов
/ 27 мая 2011
Length[DeleteDuplicates[a]]

сделал бы трюк. В зависимости от того, что еще вы собираетесь сделать, вы можете использовать Union или Tally вместо DeleteDuplicates.

1 голос
/ 30 августа 2016
CountDistinct[a]

также поможет, это функция, представленная в Mathematica 10.0, функция, эквивалентная

Length[DeleteDuplicates[a]]
...