Screaming Loud

日々是精進

辞書型における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