Bir şeyleri organize etmenin çok garip bir yolu bu. Bir sözlükte sakladıysanız, bu kolaydır:
# 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
Bir sayı sözlüğünü güncellemek için kullanılan bu kod, Python'da yaygın bir "kalıp" tır. O kadar yaygındır ki, defaultdict
bunu daha da kolaylaştırmak için oluşturulmuş özel bir veri yapısı vardır :
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
defaultdict
Bir anahtar kullanarak erişirseniz ve anahtar zaten içinde değilse defaultdict
, anahtar otomatik olarak varsayılan bir değerle eklenir. , Girdiğiniz defaultdict
çağrılabilir'i alır ve varsayılan değeri almak için çağırır. Bu durumda sınıfta geçtik int
; Python çağırdığında int()
sıfır değeri döndürür. Bu nedenle, bir URL'ye ilk başvurduğunuzda, sayısı sıfır olarak başlatılır ve ardından sayıma bir tane eklersiniz.
Ancak sayımlarla dolu bir sözlük de yaygın bir kalıptır, bu nedenle Python kullanıma hazır bir sınıf sağlar: containers.Counter
Sadece Counter
sınıfı çağırarak, herhangi bir yinelenebilirliği ileterek bir örnek oluşturursunuz ; anahtarların yinelenebilir değerlerden olduğu ve değerlerin anahtarın yinelenebilir dosyada kaç kez göründüğünün sayıları olduğu bir sözlük oluşturur. Yukarıdaki örnek şu hale gelir:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
Gösterdiğiniz gibi yapmanız gerekiyorsa, en kolay ve en hızlı yol bu üç örnekten herhangi birini kullanmak ve ardından ihtiyacınız olanı oluşturmaktır.
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()]
Python 2.7 veya daha yenisini kullanıyorsanız, bunu tek satırda yapabilirsiniz:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]