Python : Liste des dict, s'il en existe un incrément d'un dict valeur, si ce n'est ajouter un nouveau dict
Je voudrais faire quelque chose comme ça.
list_of_urls = ['http://www.google.fr/', 'http://www.google.fr/',
'http://www.google.cn/', 'http://www.google.com/',
'http://www.google.fr/', 'http://www.google.fr/',
'http://www.google.fr/', 'http://www.google.com/',
'http://www.google.fr/', 'http://www.google.com/',
'http://www.google.cn/']
urls = [{'url': 'http://www.google.fr/', 'nbr': 1}]
for url in list_of_urls:
if url in [f['url'] for f in urls]:
urls[??]['nbr'] += 1
else:
urls.append({'url': url, 'nbr': 1})
Comment puis-je faire ? Je ne sais pas si je dois prendre le tuple à éditer ou à comprendre le tuple indices?
Toute aide ?
InformationsquelleAutor Natim | 2009-11-07
Vous devez vous connecter pour publier un commentaire.
C'est une très étrange façon d'organiser les choses. Si vous avez stocké dans un dictionnaire, c'est facile:
Ce code pour la mise à jour d'un dictionnaire de compte, c'est un bon "modèle" en Python. Il est si commun qu'il existe une structure de données,
defaultdict
, créé juste pour rendre le tout encore plus facile:Si vous accédez à la
defaultdict
l'aide d'une clé, et la clé n'est pas déjà dans ladefaultdict
, la clé est ajouté automatiquement avec une valeur par défaut. Ledefaultdict
prend le callable passée dans, et les appels pour obtenir la valeur par défaut. Dans ce cas, nous avons passé en classeint
; quand Python appelsint()
elle renvoie une valeur différente de zéro. Donc, la première fois que vous faites référence à une URL, son compteur est initialisé à zéro, et puis vous ajoutez un le comte.Mais un dictionnaire complet de compte, c'est également un modèle commun, de sorte Python offre un prêt-à-utiliser la classe:
containers.Counter
Vous suffit de créer unCounter
instance par l'appel de la classe, en passant tout itératif; elle construit un dictionnaire dont les clés sont les valeurs de l'itératif, et les valeurs sont compte de combien de fois la clé est apparu dans le itératif. L'exemple ci-dessus devient alors:Si vous avez vraiment besoin de le faire de la façon dont vous l'a montré, le plus simple et le plus rapide serait d'utiliser l'une de ces trois exemples, et ensuite construire celui dont vous avez besoin.
Si vous utilisez Python 2.7 ou plus récent, vous pouvez le faire dans un one-liner:
À l'aide de la valeur par défaut fonctionne, mais le fait de:
à l'aide de
.get
, vous pouvez obtenir un retour par défaut si elle n'existe pas. Par défaut, il n', mais dans le cas que je vous ai envoyé, il serait 0.Utilisation defaultdict:
Cela fonctionne toujours très bien pour moi:
Pour le faire exactement votre chemin? Vous pourriez utiliser pour...le reste de la structure
Mais il est assez peu élégante. Avez-vous vraiment besoin de stocker les url visitées qu'une LISTE?
Si vous triez comme dict, indexé par la chaîne d'url, par exemple, il serait beaucoup plus propre:
Quelques choses à noter dans ce deuxième exemple:
urls
élimine le besoin pour passer à travers l'ensemble de laurls
liste lors de l'essai pour un seulurl
. Cette approche sera plus rapide.dict( )
au lieu des accolades rend votre code plus courtlist_of_urls
,urls
eturl
comme noms de variable rendre le code très difficile à analyser. Il est préférable de trouver quelque chose de plus clair, commeurls_to_visit
,urls_already_visited
etcurrent_url
. Je sais, c'est plus. Mais c'est plus clair.Et bien sûr, je suis en supposant que
dict(url='http://www.google.fr', nbr=1)
est une simplification de votre propre structure de données, parce que sinon,urls
pourrait simplement être:Qui peut être très élégant avec la defaultdict position:
Sauf pour la première fois, à chaque fois qu'un mot est vu l'instruction si le test échoue. Si vous êtes à la prise en compte d'un grand nombre de mots, beaucoup vont probablement se produire plusieurs fois. Dans une situation où l'initialisation d'une valeur ne va se produire une fois et l'augmentation de la valeur qui va se produire à plusieurs reprises, il est moins coûteux d'utiliser une instruction try:
vous pouvez en lire plus à ce sujet: https://wiki.python.org/moin/PythonSpeed/PerformanceTips