11
votes

Compter combien de valeurs différentes une liste prend en mathématica

Je voudrais obtenir le nombre de valeurs différentes trouvées dans une liste.

Par exemple:

la sortie de la liste a = {1,2,3,4,5} serait 5 alors que ce serait 2 pour b = {1,1,1,2 , 2} .


0 commentaires

4 Réponses :


13
votes

Utilisez deleteduplicat code> (ou Union code> dans les versions plus anciennes) pour éliminer les éléments en double. Vous pouvez ensuite compter les éléments de la liste retournée.

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

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


0 commentaires

9
votes
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.

3 commentaires

Il peut être bon de noter que les supprimer peuvent être 20 fois plus rapides que l'union. L'Union renvoie une liste triée alors que les suppressions conservent les valeurs résultantes dans leur commande d'origine.


@Sjoerd, grand point. Cela peut être beaucoup plus, si la liste est principalement duplicate. Essayez: RandomInteger [999, 150000] .


@Sjoerd, @ M.Wizard Ce que vous avez observé est entièrement dû à la nature emballée des données sur lesquelles c'est le cas. Si nous prenons l'exemple de @ ''s Exemple RND = RandomInteger [999, 150000]; et DO RND [[100000]] = 1/2; , puis effectuez les repères, < Code> Supprimplicates est toujours plus rapide mais seulement par un facteur de 3 , ce qui est probablement dû à sa complexité linéaire par rapport à la complexité N de Union .



14
votes

Juste pour l'amusement, toutes les commandes suivantes donnent également le résultat souhaité: xxx

et beaucoup plus, bien sûr.

edit

Voici une petite expérience de synchronisation (non grave) xxx

 Entrez la description de l'image ici

BTW: Notez la différence entre Binlists [] et BinCounts []

edit

une vue plus détaillée de deleteDeuplicat vs Tally xxx

méfiez-vous! Terrain de journal!

Entrez la description de l'image ici


4 commentaires

Merci Belisarius! Quel serait votre préféré? Le plus rapide ?


@ 500 Comme il a été mentionné précédemment, deleteduplicates [] est le plus rapide afaik. Ce sont juste pour montrer à l'OP d'autres moyens de faire la même chose.


@Belisarius, comme Sjoerd que la comparé à l'Union, je n'étais pas sûr de votre autre solution, merci!


@Belisarius: C'est impressionnant. Je découvre aussi que très élégante Holdform, merci.



1
votes
Length[DeleteDuplicates[a]]

0 commentaires