それは物事を整理するための非常に奇妙な方法です。辞書に保存した場合、これは簡単です。
# 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を参照するとき、そのカウントはゼロに初期化され、次にカウントに1を追加します。
しかし、カウントでいっぱいのディクショナリも一般的なパターンであるため、Pythonはすぐに使用できるクラスを提供します。クラスを呼び出してイテラブルを渡しcontainers.Counter
てCounter
インスタンスを作成するだけです。キーがイテラブルの値であるディクショナリを構築し、値はキーがイテラブルに出現した回数のカウントです。上記の例は、次のようになります。
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()]