[Python]collections counter(to csv,get max,increment)

Pythonには、リストやタプル、辞書などのデータ構造がありますが、collectionsモジュールには、Counterというデータ構造があります。Counterは、要素の出現回数をカウントしてくれる便利なクラスです。

collections.Counterとは

collections.Counterは、辞書型(dict)を継承したクラスで、要素の出現回数をカウントするためのクラスです。以下のようにして、Counterを作成することができます。

from collections import Counter
c = Counter([1, 2, 2, 3, 3, 3])
print(c)
# Counter({3: 3, 2: 2, 1: 1})

上記の例では、リスト[1, 2, 2, 3, 3, 3]の各要素の出現回数をカウントして、Counterオブジェクトを作成しています。

collections.CounterでCSVへの出力方法

CounterオブジェクトをCSVファイルに出力する場合は、以下のようにして書き出すことができます。

import csv
from collections import Counter
c = Counter(['apple', 'orange', 'apple', 'banana', 'apple'])
with open('fruits.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(c.items())
print('CSVファイルに書き込みました。')

上記の例では、Counterオブジェクトの各要素をCSVファイルに書き込んでいます。出力されるCSVファイルの内容は以下のようになります。

要素 出現回数
apple 3
orange 1
banana 1

collections.Counterで最大値を取得する方法

Counterオブジェクトから最大値を取得するには、most_commonメソッドを使います。most_commonメソッドは、出現回数の多い順に要素とその出現回数のタプルを返します。以下のようにして、最大値を取得することができます。

from collections import Counter
c = Counter([1, 2, 2, 3, 3, 3])
print(c.most_common(1))
# [(3, 3)]

上記の例では、most_common(1)で最大値の要素とその出現回数のタプルを取得しています。

collections.Counterで要素の値を増やす(increment)方法

Counterオブジェクトの要素の値を増やすには、+=演算子を使います。以下のようにして、要素の値を増やすことができます。

from collections import Counter
c = Counter([1, 2, 2, 3, 3, 3])
c[2] += 1
print(c)
# Counter({2: 3, 3: 3, 1: 1})

上記の例では、要素2の出現回数を1増やしています。

collections.Counterの応用例

Counterは、様々な場面で活用することができます。以下に、Counterの応用例をいくつか紹介します。

単語の出現回数をカウントする

テキストファイルから単語の出現回数をカウントする場合は、以下のようにしてCounterを使うことができます。

import re
from collections import Counter
with open('sample.txt') as f:
    text = f.read().lower()
    words = re.findall('\w+', text)
    c = Counter(words)
print(c.most_common(10))
# [('the', 6), ('a', 4), ('to', 3), ('in', 3), ('of', 3), ('is', 2), ('and', 2), ('it', 2), ('at', 2), ('for', 2)]

上記の例では、テキストファイルから単語を抽出して、Counterで単語の出現回数をカウントしています。

アンケートの集計をする

アンケートの回答を集計する場合は、以下のようにしてCounterを使うことができます。

from collections import Counter
answers = ['A', 'B', 'A', 'C', 'B', 'A', 'A', 'B', 'C', 'B']
c = Counter(answers)
print(c.most_common())
# [('A', 4), ('B', 4), ('C', 2)]

上記の例では、アンケートの回答をCounterで集計しています。

まとめ

Pythonのcollectionsモジュールには、Counterという便利なクラスがあります。Counterは、要素の出現回数をカウントしてくれるため、単語の出現回数のカウントやアンケートの集計など、様々な場面で活用することができます。