【Python】Counterで要素数をカウントする(collections.Counter)
.jpg)
リストの要素数をカウントする際に利用できる collections モジュールの Counter について解説します。
目次
Counter(collections モジュール)
リストに含まれる要素数をカウントする場合、count メソッドを用いた方法があります。Python では、collections モジュールに Counter という便利なカウントクラスがあり、様々な便利な機能が提供されています。
この記事では、collections モジュールの Counter で要素数をカウントする方法について紹介します。
Counter の使い方とメソッド
基本的な使い方
collections モジュールの Counter の基本的な使い方を例を使ってみてみましょう。
import collections data = ["a", "a", "a", "b", "b", "c", "a", "b", "d", "d"] counter = collections.Counter(data) print(counter) print(counter["a"])
【実行結果】
Counter({'a': 4, 'b': 3, 'd': 2, 'c': 1})
4例では、リスト data に入れた文字のカウントをとっています。Counter を使用する場合には、collections モジュールをインポートします。
Counter をインスタンス化するには、引数に対象リストを渡します。表示してみると、リスト内の要素と要素数の辞書を含むようなデータとなっています。カウント数にアクセスする場合には、counter["a"] のようにアクセスできます。
また、カウントの値を特定の値で増やしたい場合は、辞書のように扱うことが可能で以下のように += 演算子を使ってカウントを追加することもできます。
counter = collections.Counter()
for d in data:
counter[d] += 2なお、同じような処理は、同じく collections モジュール内にある defaultdict を用いても実現できます。「defaultdictで規定値を持つ辞書を定義する(collections.defaultdict)」で例を紹介していますので参考にしてください。
上位を抽出する most_common メソッド
Counter にある便利なメソッドとして、カウント数上位を抽出する most_common メソッドがあります。
import collections
data = ["a", "a", "a", "b", "b", "c", "a", "b", "d", "d"]
counter = collections.Counter(data)
print(counter)
print("=====")
# 上位1位までを抽出
print(counter.most_common(1))
# 上位2位までを抽出
print(counter.most_common(2))
# 引数なしだとすべて抽出
print(counter.most_common())【実行結果】
Counter({'a': 4, 'b': 3, 'd': 2, 'c': 1})
=====
[('a', 4)]
[('a', 4), ('b', 3)]
[('a', 4), ('b', 3), ('d', 2), ('c', 1)]most_common メソッドの引数には上位 n 番目までということで、数字を渡します。1 であれば上位 1 位まで、2 であれば上記 2 位までということになります。なお、引数に何も指定しない場合は、すべてを抽出します。
実行結果を見ると分かるように、結果はタプルのリストとなります。
カウント数のみを取り出す values メソッド
Counter でカウントをとった後にカウント数のみを取り出す場合には、values メソッドを使用できます。
import collections
data = ["a", "a", "a", "b", "b", "c", "a", "b", "d", "d"]
counter = collections.Counter(data)
print(counter)
print("=====")
# カウント数の値のみをを取り出す
print(counter.values())
# カウント数の合計を計算する
print(sum(counter.values()))【実行結果】
Counter({'a': 4, 'b': 3, 'd': 2, 'c': 1})
=====
dict_values([4, 3, 1, 2])
10例のように values でカウント数の値のみを取り出すことができます。この情報を用いて、sum 関数を使ってカウント数の合計値を計算するようなことも簡単にできます。
values メソッドの返却値は dict_values クラスのインスタンスであるため、リストで扱うには、list(counter.values()) のようにリストに変換して使います。
なお、Counter では 4、3、2、1 という順で値が表示されていますが、dict_values では、4、3、1、2 という順になっており、値の順が変わっています。これは、dict_values の順がキーの順となっているためです。
Counter の使用例
ファイル中の単語数をカウントする例
Counter の使用例として、読み込んだファイルの中にある単語数をカウントする例を見てみましょう。以下のような input.txt というテキストファイルに含まれる単語数をカウントしてみます。
Python python counter Counter
collections COLLECTIONS LIST
list LIst Dictionary {DICTIONARY}
TUPLE tuple tuple counter {COUNTER}
Set, python, PYTHON, pythoninput.txt の中に現れる単語を読み込んでカウントをとる場合には、Counter を使用して以下のように実装できます。
import collections
import re
with open("input.txt", "r", encoding="UTF-8") as f:
words = re.findall(r"\w+", f.read().lower())
print(f"words = {words}")
print("=====")
counter = collections.Counter(words)
print(counter)
print(counter.most_common(3))【実行結果】
words = ['python', 'python', 'counter', 'counter', 'collections', 'collections', 'list', 'list', 'list', 'dictionary', 'dictionary', 'tuple', 'tuple', 'tuple', 'counter', 'counter', 'set', 'python', 'python', 'python']
=====
Counter({'python': 5, 'counter': 4, 'list': 3, 'tuple': 3, 'collections': 2, 'dictionary': 2, 'set': 1})
[('python', 5), ('counter', 4), ('list', 3)]例では、正規表現の re モジュールを使用しています。正規表現は一定パターンに一致するものを抽出できるもので、この例では読み込んだ文字列を lower で小文字にしてから単語リストを作成しています。
正規表現の抽出結果はリストになっているので、Counter に渡してインスタンス化します。後は上記で見てきたメソッド等を同様に使うことができます。
このように Counter を使うことでテキスト中の単語数を簡単にカウントできます。
まとめ
リストの要素数をカウントする際に利用できる collections モジュールの Counter について解説しました。
この記事では、Counter の基本的な使い方の説明とファイル内の単語をカウントする例を紹介しました。collections モジュールの Counter は、便利なメソッドが多く用意されているため、要素数をカウントする際には使用してみてください。
上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。


.jpg)
.jpg)
.jpg)
.jpg)