それは物事を整理するための非常に奇妙な方法です。辞書に保存した場合、これは簡単です。
# 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
、渡された callable を受け取り、それを呼び出してデフォルト値を取得します。この場合、クラスに渡しましたint
。Python が呼び出すint()
と、ゼロ値が返されます。そのため、初めて URL を参照すると、そのカウントは 0 に初期化され、カウントに 1 が追加されます。
しかし、カウントでいっぱいの辞書も一般的なパターンであるため、Python はすぐに使用できるクラスを提供します。クラスを呼び出してインスタンスをcontainers.Counter
作成しCounter
、イテラブルを渡すだけです。キーが iterable からの値であり、値がキーが iterable に出現した回数のカウントであるディクショナリを構築します。上記の例は次のようになります。
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
示した方法で本当に実行する必要がある場合、最も簡単で最速の方法は、これら 3 つの例のいずれかを使用してから、必要なものをビルドすることです。
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()]