辞書型におけるsetdefaultのTips
通常の辞書
dict.setdefault()は単純に値を返すだけかと思っていたら,
辞書の辞書みたいな使い方もできるんですねー.
>>> dict = {} >>> dict.setdefault('a',{}).setdefault('b',3) 3 >>> dict {'a': {'b': 3}}
辞書の中にリスト,タプルなども可能です.
更にcollectionsモジュールを使うとシンプルかつ速いそうです.
>>> from collections import * >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] #collectionsの場合 >>> d = defaultdict(list) >>> for k, v in s: ... d[k].append(v) ... >>> d.items() [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] #普通のsetdefaultの場合 >>> d = {} >>> for k, v in s: ... d.setdefault(k, []).append(v) ... >>> d.items() [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
collectionsモジュールはこれだけではなく,スタックキューの操作なども速いんで利用してみるといいかもしれないです.
ただ,ほとんど出来ることが変わらないから通常のライブラリをcollectionsにすればいいのにとか思っているんだけどどうなんだろう?
追記:
collections.defaultdictの利点は辞書のデータ型を指定できるところにあります.
例えば,
>>> import collections >>> d = collections.defaultdict(lambda :"") >>> d["a"]=d["a"]+"a" >>> d defaultdict(<function <lambda> at 0xb729017c>, {'a': 'a'}) >>> d["b"]=d["b"]+1 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
こんな感じ.数値を足していきたい時には
>>> import collections >>> d = collections.defaultdict(lambda : 0) >>> d["a"]=d["a"]+1 >>> d defaultdict(<function <lambda> at 0xb7289b8c>, {'a': 1})
参考URL
8.3. collections — 高性能なコンテナ・データ型 — Python 2.7ja1 documentation