Це дуже дивний спосіб організації речей. Якщо ви зберігаєте в словнику, це легко:
# 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
Цей код для оновлення словника лічильників є загальною "схемою" в Python. Це так часто, що існує спеціальна структура даних defaultdict
, створена саме для того, щоб зробити це ще простіше:
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
допомогою ключа, а ключ ще не знаходиться в defaultdict
, ключ автоматично додається зі значенням за замовчуванням. Гравець defaultdict
приймає виклик, який ви передали, і викликає його, щоб отримати значення за замовчуванням. У цьому випадку ми пройшли у класі int
; коли Python викликає, int()
він повертає нульове значення. Отже, при першому посиланні на URL-адресу його кількість ініціалізується до нуля, а потім ви додаєте його до числа.
Але словник, повний підрахунків, також є загальною схемою, тому Python забезпечує готовий до використання клас: containers.Counter
Ви просто створюєте Counter
екземпляр, викликаючи клас, передаючи будь-який ітерабельний; він будує словник, де ключі - це значення з ітерабельного, а значення - це кількість, скільки разів ключ з'явився в ітерабелі. Наведений вище приклад стає:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
Якщо вам дійсно потрібно зробити це так, як ви показали, найпростішим і швидким способом було б скористатися будь-яким із цих трьох прикладів, а потім побудувати той, який вам потрібен.
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 або новішу версію, ви можете це зробити в одноланковому вкладиші:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]