唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Pythonのcollectionsモジュールが地味に便利

PythoncollectionsモジュールにはdefaultdictやCounterなどの便利なデータ構造があります。
いくつかメモ代わりに紹介しておきます

defaultdict

辞書にキーが含まれない場合のデフォルト値を指定できます。
リストをデフォルトで持つ辞書などが作れます。
defaultdictへの引数としては初期値のものを返す関数を与えます

from collections import defaultdict
d = defaultdict(list)
d['Hello'].append('World')

変わった使い方としては以前別の記事でも紹介しましたが単語にIDを割り振るのに便利です

以下のようなコードを書くと未知の単語が辞書に与えられたら、その単語に新たなIDを振っていくことができます。

wids = defaultdict(lambda: len(wids))

Counter

単語などの出現頻度を数えるのに便利です。
基本的には0を初期値とするdefaultdictと変わりませんが、いくつか便利な関数が追加されています。

リストなどのiterableなものを渡すと自動でカウントしてくれます

from collections import Counter
count = Counter('abbccc')
print count
Counter({'c': 3, 'b': 2, 'a': 1})

また通常の辞書のように値を足していくこともできます

count['d'] += 1

most_common関数を使うことで、値の上位n件を抽出できます

print count.most_common(2)
[('c', 3), ('b', 2)]

他にもCounter同士の加減算を行う関数などもあります

namedtuple

namedtupleは名前付きのタプルを作ることができます。
C言語の経験がある方には構造体的なものを作ると考えればわかりやすいと思います。

以下ではxとyという属性を持つPointという名前のタプルを作っています

from collections import namedtuple
Point = namedtuple('Point', 'x y')

普通のクラスのように初期化したり、リストなどを使って初期化することができます。

p = Point(1, 2)
q = Point(x = 2, y = 1])
r = Point._make([1, 3])

p.xやp[0]などの形で属性にアクセスできます。

またprintすると次のように整形されて出力されます
ただしASCII以外の文字は x=u'\u3042' などといった形で出力されます

Point(x=1, y=2)

ソートする際は通常のタプルと同様に手前の属性から順に見てソートされていきます

まとめ

namedtupleの書き方をよく忘れるのでメモした。
collectionsモジュールを使うとコードが楽に書けるかも。
他にdequeとかも実装されています。