calendarcodediamondfacebookfingerglobalgoogleplushatenahomepagetopplainpocketrssservicetwitterwordpresshome2searchfoldernext-arrowback-arrowfirst-arrowlast-arrow

Python: カウンタ。Counter()関数で要素数を計算する

Python 標準ライブラリである collections の Counter()関数は要素数の計算を行う。出現の回数を集計する場合などに便利である。

エンジニア速報は Twitter の@commteで 1 日 5 回配信しています。

Sponsored Link

Counter()クラス のポイント

  • ハッシュ(辞書)可能なオブジェクトを数え要素数を返す
  • イテラブル、マッピング、キーワード引数のオブジェクトを数える
  • 和集合・減算・積集合などが可能
  • subtract()で減算を行う
  • most_common()で要素を降順で返す
c = Counter()
# 空のカウンターを作成する

c = Counter('gallahad')
# イテラブルなカウンター作成

c = Counter({'red': 4, 'blue': 2})
# マッピング

c = Counter(cats=4, dogs=8)
# キーワード引数セット

ハッシュ可能なオブジェクトを数え上げる辞書(dict)のサブクラス。要素を辞書のキーとして保存し、そのカウントを辞書の値として保存するコレクション。 collections --- コンテナデータ型 — Python 3.10.0b2 ドキュメント

Counter()

要素数を数える。存在しない要素には 0 を返す。

from collections import Counter
c = Counter(['a', 'a', 'b', 'c'])
c['a']
# 2

イテラブルな要素を数える。イテラブルなオブジェクトとは、リスト、タプル、辞書、文字列など複数の要素を持ったオブジェクトを指す。

次のコードでは、タプルや文字もイテラブルなのでカウントされている。

c = Counter('abbbd')
c
# Counter({'a': 1, 'b': 3, 'd': 1})

c = Counter(('a', 'a', 'a', 'b', 'c', 'c'))
c
# Counter({'a': 3, 'b': 1, 'c': 2})

結合

リストの結合。

one = Counter(['a', 'a', 'a', 'b', 'c', 'c'])
two = Counter(['a', 'b', 'b', 'b'])

one + two
# Counter({'a': 4, 'b': 4, 'c': 2})

マッピングの結合。マッピングとは、辞書(dict)。キーと値を持つデータ、ハッシュ可能な値のことである。

one = Counter({'a': 3, 'b': 1, 'c': 2})
two = Counter({'a': 1, 'b': 3})

one + two
# Counter({'a': 4, 'b': 4, 'c': 2})

キーワード引数の結合。

one = Counter(a=3, b=1, c=2)
two = Counter(a=1, b=3)

one + two
# Counter({'a': 4, 'b': 4, 'c': 2})

取り除く

マイナスを設定すると後方の要素を除くことができるが、負や 0 は表示されない。減算するには、後述する subtract()を使う。

one = Counter(['a', 'a', 'a', 'b', 'c', 'c', 'd'])
two = Counter(['a', 'b', 'b', 'b', 'd'])

one - two

# Counter({'a': 2, 'c': 2})

subtract()で減算

subtract()は、一方から他方を取り去ることにより両者の間の差分を求める。要素から要素を減算する。0 や負も表示される。

one = Counter(['a', 'a', 'a', 'b', 'c', 'c', 'd'])
two = Counter(['a', 'b', 'b', 'b', 'd'])
one.subtract(two)
one

# Counter({'a': 2, 'b': -2, 'c': 2, 'd': 0})

積集合

& を使って積集合すると、カウンタは小さい方の値となる。つまり、共通要素が抽出されている。

one = Counter(['a', 'a', 'a', 'b', 'c', 'c'])
two = Counter(['a', 'b', 'b', 'b'])

one & two

# Counter({'a': 1, 'b': 1})

和集合

和集合を使うと、全ての要素を得ることができる。カウンタは加算されず、大きい方の要素が選択される。

one = Counter(['a', 'a', 'a', 'b', 'c', 'c'])
two = Counter(['a', 'b', 'b', 'b'])

one | two

# Counter({'a': 3, 'b': 3, 'c': 2})

for

for 文を使って要素数を辞書で返す。

c = Counter()
box = ['a', 'a', 'a', 'b', 'c', 'c']
for color in box:
    c[color] += 1
c
# Counter({'a': 3, 'b': 1, 'c': 2})

most_common()

most_common()関数と組み合わせれば要素を降順で返すことができる。文字の出現傾向などを集計するときなどに使えそうだ。

c = Counter('Lorem Ipsum is simply dummy text')
c.most_common()

# [('m', 5),
# (' ', 5),
# ('s', 3),
# ('e', 2),
# ('p', 2),
# ('u', 2),
# ('i', 2),
# ('y', 2),
# ('t', 2),
# ('L', 1),
# ('o', 1),
# ('r', 1),
# ('I', 1),
# ('l', 1),
# ('d', 1),
# ('x', 1)]

要素を指定数だけ返したい場合は、引数に整数をセットする。

c = Counter('Lorem Ipsum is simply dummy text')
c.most_common(3)
# [('m', 5), (' ', 5), ('s', 3)]

単語数をカウントする。split()を使い、半角スペースで区切った単語を数える。

txt = 'Lorem Ipsum is Lorem dummy text'
c = Counter(txt.split(' '))
c.most_common()

# [('Lorem', 2), ('Ipsum', 1), ('is', 1), ('dummy', 1), ('text', 1)]

出現数が 3 回の文字のみを抽出する。

c = Counter('Lorem Ipsum is simply dummy text')
nom = [3]
keys = []

for k in nom:
    for key, value in c.items():
        if value == k:
            keys.append(key)

print(keys)
# ['s']

Python おすすめ本

スポンサード リンク

Comments

Leave a Comment

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください