#概要
これまで、リスト内に要素が何個ずつ含まれているかをチェックするために、リスト要素をfor文で回して、dictに要素・個数の組み合わせをセットしていた。
しかし、collections.Counterクラスを使えば、一行で処理が可能となる。
#これまで(dictでごりごり)
a = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]
b = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6]
a_dict = dict()
b_dict = dict()
for item in a:
if item in a_dict:
a_dict[item] += 1
else:
a_dict[item] = 1
for item in b:
if item in b_dict:
b_dict[item] += 1
else:
b_dict[item] = 1
print(a_dict) #{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
print(b_dict) #{1: 1, 2: 2, 3: 3, 4: 4, 6: 6}
#Counterクラスを使うと
from collections import Counter
a = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]
b = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6]
a_counter = Counter(a)
b_counter = Counter(b)
print(a_counter) #Counter({5: 5, 4: 4, 3: 3, 2: 2, 1: 1})
print(b_counter) #Counter({6: 6, 4: 4, 3: 3, 2: 2, 1: 1})
#Counterクラスでは、和集合・差集合の演算が可能
from collections import Counter
a = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]
b = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6]
a_counter = Counter(a)
b_counter = Counter(b)
print(a_counter + b_counter) #Counter({4: 8, 3: 6, 6: 6, 5: 5, 2: 4, 1: 2})
print(a_counter - b_counter) #Counter({5: 5})
#Counterの内容のソート
直接ソートは出来ないので、以下の様に(個数,キー値)タプルのリストを個数でソートして、さらに(キー値,個数)のリストに戻す様にする。
したがって、ソート結果はタプルのリスト型になる。
from collections import Counter
a = ["A", "B", "B", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "E"]
a_counter = Counter(a)
#昇順ソート
a_counter_sorted = [(l, k) for k, l in sorted([(j, i) for i, j in a_counter.items()])]
print(a_counter_sorted) #[('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', 5)]
#降順ソート
a_counter_sorted = [(l, k) for k, l in sorted([(j, i) for i, j in a_counter.items()], reverse=True)]
print(a_counter_sorted) #[('E', 5), ('D', 4), ('C', 3), ('B', 2), ('A', 1)]
#AtCoderでCounterクラスを利用すると簡単に解ける問題
-
https://atcoder.jp/contests/abc181/tasks/abc181_d
→これの解説でCounterの存在を知った -
https://atcoder.jp/contests/abc072/tasks/arc082_a
→ai,ai-1,ai+1をリストにぶち込み、リストをCounter化して、Couterの個数が一番大きいキー値が答え -
https://atcoder.jp/contests/abc058/tasks/arc071_a
→Counterを積演算し、残った要素を昇順で個数分結合する