2011-05-27 13 views

Respuesta

14

Sólo por diversión, todos los siguientes comandos también dan el resultado deseado:

[email protected]@l 

[email protected]@l 

[email protected]@l 

Count[[email protected], [email protected]] 

Count[[email protected], [email protected]{}] 

[email protected]@[email protected] 

[email protected][l, # &] 

[email protected]@SortBy[l, # &] 

Y muchos más, por supuesto.

Editar

Aquí es un pequeño experimento de distribución (no grave)

l = RandomInteger[{1, 10^2}, 10^7]; 
t2[x_] := {Timing[x], ToString[[email protected]]}; 
SetAttributes[t2, HoldAll] 
Grid[Reverse /@ 
    {t2[[email protected][l]], 
    t2[[email protected][l]], 
    t2[[email protected][l]], 
    t2[Count[BinCounts[l], [email protected]]], 
    t2[[email protected][l]], 
    t2[[email protected]@[email protected]], 
    t2[Count[BinLists[l], [email protected]]]}, 
Frame -> All] 

enter image description here

Por cierto: Tenga en cuenta la diferencia entre BinLists[ ] y BinCounts[ ]

Editar

una vista más detallada de DeleteDuplicates vs Tally

t = Timing; 
[email protected]@ 
    Table[l = RandomInteger[{1, 10^i}, 10^7]; 
    {[email protected]@[email protected]@[email protected], 
    [email protected]@[email protected]@[email protected]}, 
    {i, Range[7]}] 

¡Cuidado! ¡Diagrama de registro!

enter image description here

+0

¡Gracias Belisarius! ¿Cuál sería tu favorito? Más rápido? – 500

+0

@ 500 Como se mencionó anteriormente, 'DeleteDuplicates []' es el AFAIK más rápido. Estos son solo para mostrarle al OP algunas otras maneras de hacer lo mismo. –

+0

@Belisarius, como Sjoerd solo lo comparó con Union, no estaba seguro acerca de su otra solución, ¡gracias! – 500

13

Utilice DeleteDuplicates (o Union en versiones anteriores) para eliminar los elementos duplicados. Luego puede contar los elementos en la lista devuelta.

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

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

que hacer el truco. Dependiendo de qué otra cosa vaya a hacer, puede usar Union o Tally en lugar de DeleteDuplicates.

+5

Puede ser bueno tener en cuenta que DeleteDuplicates pueden ser 20 veces tan rápido como Union. Union devuelve una lista ordenada, mientras que DeleteDuplicates conserva los valores resultantes en su orden original. –

+0

¡Gracias, Brett! – 500

+0

@Sjoerd, gran punto. Puede ser mucho más, si la lista es en su mayoría duplicados. Pruebe: 'RandomInteger [999, 150000]'. –

1
CountDistinct[a] 

haría también hacer el truco, que es una función introducida en Mathematica 10.0, una función equivalente a

Length[DeleteDuplicates[a]] 
Cuestiones relacionadas