LoginSignup
25
21

More than 3 years have passed since last update.

【Python】辞書(ハッシュ)

Last updated at Posted at 2016-08-11

Pythonではハッシュ(正確にはハッシュテーブル)のことを辞書と呼ぶ。

辞書の機能を利用して各KWの出現回数を集計する場合など、Counterdefaultdictという辞書のサブクラスを利用すると良い。
例えば、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
25
21
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
21