Questo è un modo molto strano per organizzare le cose. Se hai memorizzato in un dizionario, questo è 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
Questo codice per l'aggiornamento di un dizionario dei conteggi è un "modello" comune in Python. È così comune che esiste una struttura dati speciale defaultdict
, creata proprio per renderlo ancora più semplice:
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
Se si accede a defaultdict
utilizzando una chiave e la chiave non è già presente in defaultdict
, la chiave viene automaticamente aggiunta con un valore predefinito. Il defaultdict
prende il callable avete passato, e lo chiama per ottenere il valore di default. In questo caso, siamo passati in classe int
; quando Python chiama int()
restituisce un valore zero. Quindi, la prima volta che fai riferimento a un URL, il suo conteggio viene inizializzato a zero, quindi ne aggiungi uno al conteggio.
Ma un dizionario pieno di conteggi è anche un modello comune, quindi Python fornisce una classe pronta per l'uso: containers.Counter
basta creare Counter
un'istanza chiamando la classe, passando qualsiasi iterabile; crea un dizionario in cui le chiavi sono valori dell'iterabile e i valori sono i conteggi di quante volte la chiave è apparsa nell'iterabile. L'esempio sopra diventa quindi:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
Se hai davvero bisogno di farlo nel modo in cui hai mostrato, il modo più semplice e veloce sarebbe quello di utilizzare uno qualsiasi di questi tre esempi e quindi creare quello che ti serve.
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()]
Se stai usando Python 2.7 o più recente, puoi farlo in una riga:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]