To bardzo dziwny sposób organizowania rzeczy. Jeśli przechowywane w słowniku, to jest proste:
# 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
Ten kod do aktualizacji słownika liczy jest częstym „wzór” w Pythonie. To jest tak powszechne, że istnieje specjalna struktura danych, defaultdict
, stworzony tylko do tego jeszcze łatwiejszy:
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
Jeśli dostęp do defaultdict
użyciu klucza i klucz nie jest już w defaultdict
, klucz jest automatycznie dodawany z wartością domyślną. Numer defaultdict
przejmuje żądaną liczbę wywołań i wywołuje ją, aby uzyskać wartość domyślną. W tym przypadku przeszliśmy w klasie int
; gdy Python wywołuje int()
, zwraca wartość zero. Przy pierwszym odwołaniu się do adresu URL jego licznik jest inicjowany do zera, a następnie do licznika.
Ale słownik pełen zliczeń jest również powszechnym wzorcem, więc Python zapewnia klasę gotową do użycia: containers.Counter
Po prostu tworzysz instancję Counter
, wywołując klasę, przekazując w dowolnej iteracji; buduje słownik, w którym klucze są wartościami z iteracji, a wartości są zliczeniami ile razy klucz pojawił się w iteracji. Powyższy przykład wówczas postać:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
Jeśli naprawdę trzeba to zrobić tak, jak pokazał, najprostszym i najszybszym sposobem byłoby wykorzystanie jednego z tych trzech przykładów, a następnie zbudować jedną, czego potrzebujesz.
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()]
Jeśli używasz Pythona 2.7 lub nowszej można to zrobić w jednej wkładki:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]
Odpowiedzi są bardzo interesujące, dziękuję. – Natim