Help us understand the problem. What is going on with this article?

【Python】リストの要素の数え上げ、collections.Counterの使い方

はじめに

今回はPythonのcollections.Counter()についてまとめます。
AtCoderのPython3.4.3で動作確認済みです。

collections.Counterについて

collections.Counterは標準モジュールの一つで、リストの各要素の数え上げが出来ます。また、返り値は辞書型のサブクラスということで、辞書型と同じ操作が出来ます。

使い方

Counter(リスト)でリストの要素のカウント結果を得ることが出来ます。

Counter
from collections import Counter
a = ['a', 'b', 'c', 'd', 'a', 'a', 'b']
c = Counter(a)
print(c)
出力
Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})

要素が文字列でなくてもカウント出来ます。

Counter
from collections import Counter
b = [1, 5, 4, 2, 1, 5, 5]
d = Counter(b)
print(d)
出力
Counter({5: 3, 1: 2, 4: 1, 2: 1})

辞書型としての扱い

前述したようにCounterは辞書型として扱うことが出来ます。

keyとvalue
from collections import Counter
a = ['a', 'b', 'c', 'd', 'a', 'a', 'b']
c = Counter(a)

print(c.keys())        # keyを取り出す
print(list(c.keys()))  # keyをリストに格納

print(c.values())        # valueを取り出す
print(list(c.values()))  # valueをリストに格納

print(c.items())        # keyとvalueを取り出す
print(list(c.items()))  # keyとvalueをリストに格納
出力
dict_keys(['a', 'b', 'c', 'd'])
['a', 'b', 'c', 'd']

dict_values([3, 2, 1, 1])
[3, 2, 1, 1]

dict_items([('a', 3), ('b', 2), ('c', 1), ('d', 1)])
[('a', 3), ('b', 2), ('c', 1), ('d', 1)]

keyとして要素を指定するとその値が返ってきます。

keyとvalue
a = ['a', 'b', 'c', 'd', 'a', 'a', 'b']
c = Counter(a)
print(c['a'])
print(c['b'])
出力
3
2

zip関数を用いてkeyとvalueをまとめて受け取ることもできます。
なお、リストやタプルには*を、辞書には**を付けて引数に指定することにより、それらが展開されてそれぞれの要素が個別の引数として渡されます。

a = ['a', 'b', 'c', 'd', 'a', 'a', 'b']
c = Counter(a)
keys, values = zip(*c.most_common())
print(keys)
print(values)
出力
('a', 'b', 'c', 'd')
(3, 2, 1, 1)

Counter.most_common()

Counterにはmost_common()というメソッドがあります。これは(要素, 出現回数)というタプルを出現回数順に並べたリストを返します。

Counter.most_common()
from collections import Counter
a = ['a', 'b', 'c', 'd', 'a', 'a', 'b']
c = Counter(a)
d = c.most_common()
print(d)      # 出現回数順のタプルのリスト
print(d[0])   # 1番出現回数が多いもののkeyとvalue
print(d[-1])  # 1番出現回数が少ないもののkeyとvalue
print(d[0][0])  # 1番出現回数が多いkey
print(d[0][1])  # 1番出現回数が多いkeyのvalue
出力
[('a', 3), ('b', 2), ('c', 1), ('d', 1)]
('a', 3)
('d', 1)
a
3

most_common()count()をひと工夫して条件に合う要素を挙げることもできます。

Counter.most_common()
from collections import Counter
a = ['a', 'b', 'c', 'd', 'a', 'a', 'b']
c = Counter(a)
d = c.most_common()

# 出現回数が2回以上のものを列挙(重複あり)
print([i for i in a if a.count(i) >= 2])
# 出現回数が2回以上のものを列挙(重複なし)
print([i[0] for i in c.items() if i[1] >= 2])
出力
['a', 'b', 'a', 'a', 'b']
['a', 'b']

おわりに

読んでいただきありがとうございました。指摘等ありましたら是非コメントお願いします。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away