befs_anneの日記

雰囲気でネットワークをやっている

【競プロ】defaultdictとCounter

概要

データサイエンスに関する本を買ってみたものの、サイエンスするための基礎知識が圧倒的に足りておらず身が入らない始末。サイエンス関連のアウトプットはひとまず置いといて、「2章 Python速習コース」の中で競プロに役に立ちそうなテクニックをメモして、3,200円 + 税はムダじゃなかったと思いたいがための記事。

ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践

ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践

defaultdict

文字列やリストに含まれている要素の種類をカウントする時、defaultdictクラスを使うとシンプルに書ける。

from collections import defaultdict

document = "zabbix"
count_dict = defaultdict(int) # 引数は初期値(int()は0らしい)

for cal in document:
        count_dict[cal] += 1

print(dict(count_dict))
# {'z': 1, 'a': 1, 'b': 2, 'i': 1, 'x': 1}

素で書くと、キーが既にある場合と新規の場合の両方を考慮しなくちゃならない。

# defaultdict使わない版

document = "zabbix"
count_dict = {}

for cal in document:
    if cal in count_dict:
        count_dict[cal] += 1
    else:
        count_dict[cal] = 1

print(count_dict)
# {'z': 1, 'a': 1, 'b': 2, 'i': 1, 'x': 1}

初期値はintだけではなく、dictや別の関数も指定可能。

Counter

defaultdictの「初期値指定できない代わりに短く書ける版」みたいな感じ。

from collections import Counter

document = "zabbix"
count_dict = Counter(document)

print(dict(count_dict))
# {'z': 1, 'a': 1, 'b': 2, 'i': 1, 'x': 1}