collections

【Python】Counterで要素数をカウントする(collections.Counter)

【Python】Counterで要素数をカウントする(collections.Counter)
naoki-hn

リストの要素数をカウントする際に利用できる collections モジュールの Counter について解説します。

Countercollections モジュール)

リストに含まれる要素数をカウントする場合、count メソッドを用いた方法があります。count メソッドの使い方は「リスト(list)の要素数をカウントする方法」でまとめていますので参考にしてください。

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 をインスタンス化するには、引数に対象リストを渡します。print してみると分かりますが、リスト内の要素と要素数に関する辞書を含むようなデータとなっています。カウント数にアクセスする場合には、counter["a"] のようにアクセス可能です。

また、カウントの値を特定の値で増やしたい場合は、辞書のように扱うことが可能で以下のように += 演算子を使ってカウントを追加することもできます。

counter = collections.Counter()
for d in data:
    counter[d] += 2

なお、同じような処理は、同じく collections モジュール内にある defaultdict を用いても実現できます。「defaultdictで規定値を持つ辞書を定義する(collections.defaultdict)」で例を紹介していますので参考にしてください。

上位を抽出する most_common メソッド

Counter にある便利なメソッドとして、カウント数上位を抽出する most_common メソッドがあります。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, python

input.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 モジュールを使用しています。re モジュールの使い方は「正規表現モジュール re の基本的な使い方」を参考にしてください。

正規表現は一定パターンに一致するものを抽出できるもので、この例では読み込んだ文字列を lower で小文字にしてから単語リストを作成しています。

正規表現の抽出結果はリストになっているので、Counter に渡してインスタンス化します。後は上記で見てきたメソッド等を同様に使うことができます。

このようにすることで Counter を使ってテキストファイル中の単語数を簡単にカウントすることが可能です。

まとめ

リストの要素数をカウントする際に利用できる collections モジュールの Counter について解説しました。

この記事では、Counter の基本的な使い方の説明とファイル内の単語をカウントする例を紹介しました。collections モジュールの Counter は、便利なメソッドが多く用意されているため、是非要素数をカウントする際には使用してみてください。

Counter の公式ドキュメントはこちらを参照してください。

ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド
ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました