C'est une façon très étrange d'organiser les choses. Si vous avez enregistré 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 mettre à jour un dictionnaire de comptes est un « modèle » commun en Python. Il est si fréquent qu'il y ait une structure de données spéciale, defaultdict
, créé juste pour faire 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 la clé est pas déjà dans la defaultdict
, la clé est automatiquement ajouté avec une valeur par défaut. Le defaultdict
prend l'appelable que vous avez passé, et l'appelle pour obtenir la valeur par défaut. Dans ce cas, nous avons passé dans la classe int
; lorsque Python appelle int()
, il renvoie une valeur nulle. Ainsi, la première fois que vous référencez une URL, son nombre est initialisé à zéro, puis vous en ajoutez un au compte.
Mais un dictionnaire complet de comptes est également un modèle commun, donc Python fournit une classe prête à l'emploi: containers.Counter
Vous venez de créer une instance Counter
en appelant la classe, en passant n'importe quel itérable; il construit un dictionnaire où les clés sont des valeurs de l'itératif, et les valeurs sont des comptes de combien de fois la clé est apparue dans le 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 avez vraiment besoin de le faire de la façon dont vous avez fait preuve, la façon la plus simple et la plus rapide serait d'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 plus récente, vous pouvez le faire dans une seule ligne:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]
Les réponses sont très intéressantes, merci. – Natim