C'est une manière très étrange d'organiser les choses. Si vous avez stocké 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 de mise à jour d'un dictionnaire de comptages est un "modèle" courant en Python. Il est si courant qu'il existe une structure de données spéciale defaultdict
, créée juste pour rendre cela 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 le defaultdict
, la clé est automatiquement ajoutée 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 sommes passés en classe int
; lorsque Python l'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 nombre.
Mais un dictionnaire plein de décomptes est aussi un modèle courant, donc Python fournit une classe prête à l'emploi: containers.Counter
vous créez simplement une Counter
instance 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érable, et les valeurs sont des décomptes du nombre de fois où 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 avez vraiment besoin de le faire comme vous l'avez montré, le moyen le plus simple et le plus rapide serait d'utiliser l'un de ces trois exemples, puis de créer 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écent, 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()]