Pythonではハッシュ(正確にはハッシュテーブル)のことを辞書と呼ぶ。
辞書の機能を利用して各KWの出現回数を集計する場合など、Counterやdefaultdictという辞書のサブクラスを利用すると良い。
例えば、Counterやdefaultdictを利用しないと、下記のように冗長な記述が必要となる。
sample1.py
# 辞書の初期化
count_by_kw = {}
# KeyErrorとなる
count_by_kw['apple'] += 1
# 冗長になるが次のように書く必要がある
if count_by_kw.get('apple'):
count_by_kw['apple'] += 1
else:
count_by_kw['apple'] = 1
これをCounterを利用すると、下記のようにシンプルに記述することができる。
また、most_commonメソッドを使えば、valueが大きい順にkeyを取り出すこともできる。
sample2.py
from collections import Counter
# 辞書の初期化
count_by_kw = Counter()
# シンプルな記述にできる
count_by_kw['apple'] += 1
count_by_kw['apple'] += 1
count_by_kw['apple'] += 1
count_by_kw['peach'] += 1
count_by_kw['orange'] += 1
count_by_kw['orange'] += 1
# valueの値が大きい順(apple -> orange -> peach)にkeyを取り出す
for kw, count in count_by_kw.most_common():
print(kw, count)
$ python sample2.py
apple 3
orange 2
peach 1
さらに、Counterとdefaultdictを組み合わせると、辞書の中に辞書(ネストした辞書)を作ることも可能になる。
もちろん、most_commonメソッドも使える。
sample3.py
from collections import Counter, defaultdict
# 辞書の初期化
count_by_category_and_kw = defaultdict(Counter)
# 辞書の辞書
count_by_category_and_kw['A']['apple'] += 1
count_by_category_and_kw['A']['apple'] += 1
count_by_category_and_kw['A']['orange'] += 1
# 外側の辞書からkeyとvalueを取り出し、さらに内側の辞書からkeyとvalueを取り出す
for category, count_by_kw in count_by_category_and_kw.items():
for kw, count in count_by_kw.most_common():
print(category, kw, count)
$ python sample3.py
A apple 2
A orange 1
次のように、辞書の中の辞書(ネストした辞書)に配列を入れることも可能。
その場合はlambda(無名関数)を使ってdefaultdictをネストして書く。
sqmple4.py
from collections import defaultdict
# 辞書の初期化
persons_by_org_and_team = defaultdict(lambda: defaultdict(list))
# 辞書の辞書
persons_by_org_and_team['A']['x'].append('Taro')
persons_by_org_and_team['A']['x'].append('Hanako')
persons_by_org_and_team['A']['y'].append('Jiro')
# 外側の辞書からkeyを取り出し、さらに内側の辞書からkeyを取り出し、最後にvalueを取り出す
for org in persons_by_org_and_team.keys():
for team in persons_by_org_and_team[org].keys():
for person in persons_by_org_and_team[org][team]:
print(org, team, person)
$ python sample4.py
A x Taro
A x Hanako
A y Jiro