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()]
L'utilisation de la valeur par défaut fonctionne, mais aussi:
en utilisant
.get
, vous pouvez obtenir un retour par défaut s'il n'existe pas. Par défaut, c'est Aucun, mais dans le cas où je vous ai envoyé, ce serait 0.la source
Utilisez defaultdict :
la source
Cela fonctionne toujours bien pour moi:
la source
Pour le faire exactement à votre façon? Vous pouvez utiliser la structure for ... else
Mais c'est assez inélégant. Devez-vous vraiment stocker les URL visitées sous forme de LISTE? Si vous le triez comme un dict, indexé par chaîne d'URL, par exemple, ce serait beaucoup plus propre:
Quelques points à noter dans ce deuxième exemple:
urls
supprime le besoin de parcourir toute laurls
liste lors du test d'un seulurl
. Cette approche sera plus rapide.dict( )
au lieu d'accolades rend votre code plus courtlist_of_urls
,urls
eturl
que les noms de variables font le code assez difficile à analyser. Il vaut mieux trouver quelque chose de plus clair, commeurls_to_visit
,urls_already_visited
etcurrent_url
. Je sais, c'est plus long. Mais c'est plus clair.Et bien sûr, je suppose que
dict(url='http://www.google.fr', nbr=1)
c'est une simplification de votre propre structure de données, car sinon, celaurls
pourrait simplement être:Ce qui peut devenir très élégant avec la position defaultdict :
la source
Sauf pour la première fois, chaque fois qu'un mot est vu, le test de l'instruction if échoue. Si vous comptez un grand nombre de mots, plusieurs se produiront probablement plusieurs fois. Dans une situation où l'initialisation d'une valeur ne se produira qu'une fois et l'augmentation de cette valeur se produira plusieurs fois, il est moins coûteux d'utiliser une instruction try:
vous pouvez en savoir plus à ce sujet: https://wiki.python.org/moin/PythonSpeed/PerformanceTips
la source