Esa es una forma muy extraña de organizar las cosas. Si almacenó en un diccionario, esto es fácil:
# 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
Este código para actualizar un diccionario de conteos es un "patrón" común en Python. Es tan común que existe una estructura de datos especial defaultdict
, creada solo para hacer esto aún más fácil:
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 accede al defaultdict
mediante una clave, y la clave aún no está en el defaultdict
, la clave se agrega automáticamente con un valor predeterminado. El defaultdict
toma el invocable que le pasó y lo llama para obtener el valor predeterminado. En este caso, pasamos en clase int
; cuando Python llama int()
, devuelve un valor cero. Entonces, la primera vez que hace referencia a una URL, su recuento se inicializa en cero y luego agrega uno al recuento.
Pero un diccionario lleno de cuentas también es un patrón común, por lo que Python proporciona una clase lista para usar: containers.Counter
simplemente crea una Counter
instancia llamando a la clase, pasando cualquier iterable; construye un diccionario donde las claves son valores del iterable, y los valores son recuentos de cuántas veces apareció la clave en el iterable. El ejemplo anterior se convierte entonces en:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
Si realmente necesita hacerlo de la manera que mostró, la forma más fácil y rápida sería usar cualquiera de estos tres ejemplos y luego construir el que necesita.
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 está utilizando Python 2.7 o más reciente, puede hacerlo en una sola línea:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]