collections.Counter.fromkeys() 関数の詳細解説


from collections import Counter

# 文字列の各文字をカウントする
counter = Counter("Hello, world!")
print(counter)
Counter({'H': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1})

上記の例では、Counter("Hello, world!")"Hello, world!" の各文字をキーとして持つ Counter オブジェクトを作成します。各キーの値は 1 であり、これは各文字が 1 回出現することを意味します。

デフォルト値を変更する

デフォルト値を変更するには、fromkeys() メソッドの第 2 引数に値を指定します。

# 各文字を 2 回出現したと仮定する
counter = Counter("Hello, world!", 2)
print(counter)
Counter({'H': 2, 'e': 2, 'l': 6, 'o': 4, ',': 2, ' ': 2, 'w': 2, 'r': 2, 'd': 2, '!': 2})

使用例

collections.Counter.fromkeys() は、以下のタスクに役立ちます。

  • 集合の要素の個数をカウントする
  • リストの各要素の出現回数をカウントする
  • 文字列の各文字の出現回数をカウントする

collections.Counter.fromkeys() は、イテラブルの要素をキーとして持つ Counter オブジェクトを作成する便利なメソッドです。デフォルト値を変更することで、各要素の出現回数に関する仮定を反映することができます。

  • fromkeys() メソッドは、キーがハッシュ可能である必要があります。ハッシュ可能でないオブジェクトをキーとして使用すると、エラーが発生します。
  • collections.Counter.fromkeys() は、Counter() コンストラクタよりも効率的に動作します。これは、fromkeys() がイテラブルを一度だけスキャンするのに対し、Counter() コンストラクタは各要素に対してインクリメント操作を実行するためです。


例 1:文字列の各文字の出現回数をカウントする

from collections import Counter

text = "Hello, world!"
counter = Counter(text)
print(counter)

このコードは、"Hello, world!" 内の各文字の出現回数をカウントします。出力は以下のようになります。

Counter({'H': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1})

例 2:リストの各要素の出現回数をカウントする

from collections import Counter

numbers = [1, 2, 3, 1, 2, 3, 4, 5]
counter = Counter(numbers)
print(counter)

このコードは、numbers リスト内の各数字の出現回数をカウントします。出力は以下のようになります。

Counter({1: 2, 2: 2, 3: 2, 4: 1, 5: 1})

例 3:集合の要素の個数をカウントする

from collections import Counter

colors = {"red", "green", "blue", "red", "green"}
counter = Counter(colors)
print(counter)

このコードは、colors セット内の各色の個数をカウントします。出力は以下のようになります。

Counter({'red': 2, 'green': 2, 'blue': 1})
from collections import Counter

text = "Hello, world!"
counter = Counter(text, default=2)
print(counter)

このコードは、"Hello, world!" 内の各文字の出現回数を 2 と仮定してカウントします。出力は以下のようになります。

Counter({'H': 2, 'e': 2, 'l': 6, 'o': 4, ',': 2, ' ': 2, 'w': 2, 'r': 2, 'd': 2, '!': 2})


手動で辞書を作成する

最も基本的な方法は、手動で辞書を作成することです。各キーの値を 1 に初期化します。

def create_counter(iterable):
  counter = {}
  for item in iterable:
    counter[item] = 1
  return counter

text = "Hello, world!"
counter = create_counter(text)
print(counter)
{'H': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1}

defaultdict を使用する

collections モジュールの defaultdict クラスを使用すると、キーが存在しない場合にデフォルト値を自動的に返す辞書を作成できます。

from collections import defaultdict

def create_counter(iterable):
  counter = defaultdict(int)
  for item in iterable:
    counter[item] += 1
  return counter

text = "Hello, world!"
counter = create_counter(text)
print(counter)
{'H': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1}

itertools.groupby() を使用する

itertools モジュールの groupby() 関数を使用すると、イテラブルをキーに基づいてグループ化できます。各グループの要素数は、Counter オブジェクトを使用してカウントできます。

from itertools import groupby

def create_counter(iterable):
  counter = Counter()
  for key, group in groupby(iterable):
    counter[key] = len(list(group))
  return counter

text = "Hello, world!"
counter = create_counter(text)
print(counter)
{'H': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1}

pandas を使用する (データフレームの場合)

pandas ライブラリを使用している場合は、DataFrame.value_counts() メソッドを使用して、列の値の出現回数を素早く簡単にカウントできます。

import pandas as pd

data = pd.DataFrame({'column': ["Hello", "world", "!"]})
counter = data['column'].value_counts()
print(counter)

このコードは、"Hello", "world", "!" の出現回数をカウントします。出力は以下のようになります。

Hello    1
world    1
!        1
Name: column, dtype: int64

上記以外にも、Python で Counter を作成する方法はいくつかあります。使用する方法は、データの種類や要件によって異なります。

  • pandas データフレームを使用している場合は、DataFrame.value_counts() メソッドを使用します。
  • イテラブルをキーに基づいてグループ化したい場合は、itertools.groupby() 関数を使用します。
  • 柔軟性が必要な場合は、手動で辞書を作成するか、defaultdict クラスを使用します。
  • シンプルでメモリ効率の高い方法が必要な場合は、collections.Counter.fromkeys() 関数を使用します。