Adresse : http://docs.python.org/3.3/library/collections.html#counter-objects
Syntaxe : from collections import Counter
La classe Counter permet de créer des dictionnaires spécialisés dans le comptage des occurences d’un motif particulier dans un objet (par exemple le nombre de fois où apparaissent les différentes lettres d’une chaîne de caractères).
La classe Counter hérite des méthodes propres aux dictionnaires.
Le constructeur Counter accepte un itérable, et il crée un dictionnaire dont les clefs sont les éléments de l’itérable et dont les valeurs correspondantes sont les nombres de fois où ces éléments apparaissent dans l’itérable.
On crée ici un compteur indiquant le nombre d’occurences de chaque lettre d’une chaîne.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> from collections import Counter # importe la classe Counter du module collections >>> cnt = Counter('abracadabra'); cnt # combien de fois certaines lettres dans 'abracadabra' Counter({'a': 5, 'r': 2, 'b': 2, 'd': 1, 'c': 1}) >>> cnt['b'], cnt['z'] # combien de fois 'b', ou 'z' (5, 0) >>> list(cnt.elements()) # la liste des éléments, avec répétitions ['d', 'r', 'r', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'c'] >>> cnt.most_common() # liste triée suivant les fréquences décroissantes [('a', 5), ('r', 2), ('b', 2), ('d', 1), ('c', 1)] >>> cnt.most_common(3) # les trois éléments les plus fréquents [('a', 5), ('r', 2), ('b', 2)] >>> cnt.most_common()[-1] # l'élément le plus rare ('c', 1) |
On peut créer des objets de type Counter à partir d’une séquence d’objets du type valeur = frequence.
La classe Counter autorise des opérations ensemblistes (on agit sur les fréquences).
|
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> c1 = Counter(a=5, b=3, c=2, d= 6, e=1); c1 # on crée un premier Counter Counter({'d': 6, 'a': 5, 'b': 3, 'c': 2, 'e': 1}) >>> c2 = Counter(a=1, b=4, d= 6, e=1); c2 # puis un deuxième Counter({'d': 6, 'b': 4, 'e': 1, 'a': 1}) >>> c1 + c2 # ajoute les fréquences Counter({'d': 12, 'b': 7, 'a': 6, 'e': 2, 'c': 2}) >>> c1 - c2 # on les soustrait (ne garde que les positives) Counter({'a': 4, 'c': 2}) >>> c1 & c2 # intersection (minimum des fréquences) Counter({'d': 6, 'b': 3, 'e': 1, 'a': 1}) >>> c1 | c2 # union (maximum des fréquences) Counter({'d': 6, 'a': 5, 'b': 4, 'c': 2, 'e': 1}) |
Les exemples suivants montrent comment utiliser la classe Counter pour mesurer des fréquences dans des simulations d’expériences aléatoires.
|
1 2 3 4 5 6 7 8 9 10 11 |
>>> from random import randint >>> g = (randint(1,6) for k in range(1000)) # un générateur de 1000 lancers d'un dé >>> rf = Counter(g); rf # dictionnaire des résultats/fréquences Counter({3: 175, 2: 172, 4: 171, 5: 167, 1: 159, 6: 156}) >>> [rf[r] for r in sorted(rf)] # extrait fréquences, dans l'ordre des résultats r [159, 172, 175, 171, 167, 156] >>> g2 = (randint(1,6)+randint(1,6) for k in range(1000)) # génère 1000 sommes de deux dés >>> rf2 = Counter(g2); rf2 # dictionnaire des sommes/fréquences Counter({7: 190, 6: 137, 8: 126, 9: 116, 5: 102, 4: 87, 10: 73, 3: 58, 11: 51, 2: 32, 12: 28}) >>> [rf2[k] for k in sorted(rf2)] # les fréquences selon les sommes croissantes [32, 58, 87, 102, 137, 190, 126, 116, 73, 51, 28] |
Retour à l’accueil du cours Python/Numpy
Sommaire du chapitre 7
- Le module random
- Le module decimal
- Le module fractions
- Le module string
- Le module itertools
- Les modules operator et functools
- Le module time
- La classe Counter du module collections
- La classe deque du module collections
- Le module heapq
- Le module bisect
- Le module copy
- Autres modules et adresses utiles