C'est une façon très étrange d'organiser les choses. Si vous stockez dans un dictionnaire, c'est facile :
# This example should work in any version of Python.
# urls_d will contain URL keys, with counts as values, like: {'http://www.google.fr/' : 1 }
urls_d = {}
for url in list_of_urls:
if not url in urls_d:
urls_d[url] = 1
else:
urls_d[url] += 1
Ce code pour la mise à jour d'un dictionnaire de comptes est un "motif" commun en Python. Il est si commun qu'il existe une structure de données spéciale, defaultdict
créé juste pour rendre la chose encore plus facile :
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
Si vous accédez au defaultdict
à l'aide d'une clé, et que la clé n'est pas déjà dans l'application defaultdict
la clé est automatiquement ajoutée avec une valeur par défaut. Le site defaultdict
prend le callable que vous avez passé, et l'appelle pour obtenir la valeur par défaut. Dans ce cas, nous avons passé la classe int
; lorsque Python appelle int()
il renvoie une valeur nulle. Ainsi, la première fois que vous faites référence à une URL, son compte est initialisé à zéro, puis vous ajoutez un au compte.
Mais un dictionnaire rempli de comptes est également un modèle courant, c'est pourquoi Python fournit une classe prête à l'emploi : containers.Counter
Il suffit de créer un Counter
en appelant la classe, en passant n'importe quel itérable ; elle construit un dictionnaire où les clés sont des valeurs de l'itérable, et les valeurs sont des comptes de combien de fois la clé est apparue dans l'itérable. L'exemple ci-dessus devient alors :
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
Si vous devez vraiment procéder de la manière indiquée, la méthode la plus simple et la plus rapide consiste à utiliser l'un de ces trois exemples, puis à construire celui dont vous avez besoin.
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
urls = [{"url": key, "nbr": value} for key, value in urls_d.items()]
Si vous utilisez Python 2.7 ou une version plus récente, vous pouvez le faire en une seule ligne :
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]