Pythonクックブック(4章)

ディクショナリの部分集合作成

前回dict()とzip()を使って、ディクショナリを作ったが、ちゃんと理解出来てなかったので復習。
これがよくわかってなかったので今日やった部分集合作成がチンプンカンプンだった。

まず、マップ型のヘルプを見ると、以下のようになっていて、
ビルドインクラスのdictに対して、タプルのシーケンスを渡せば良い。

class dict(object)
 |  dict(seq) -> new dictionary initialized as if via:
 |      d = {}
 |      for k, v in seq:
 |          d[k] = v

次にzipメソッドのヘルプを見ると、以下のようになっており、
シーケンスを渡すと、受け取ったシーケンスの各要素を要素とするタプルのリストを返す。

zip(...)
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
    
    Return a list of tuples, where each tuple contains the i-th element
    from each of the argument sequences.  The returned list is truncated
    in length to the length of the shortest argument sequence.

なので、dict(zip(key_seq, value_seq)) で
keyからなるリストとvalueからなるリストを受け取って、マップオブジェクトをと生成できる。


復習も出来たので部分集合作成。
作成する部分集合に含まれるキーと元のマップオブジェクトを渡すことで生成

[kobakoba0723@fedora13-intel64 ~]$ cat sub_dict.py 
def sub_dict(whole_dict, part_key, default=None):
    return dict([(key, whole_dict.get(key, default)) for key in part_key])

if __name__ == '__main__':
    color_key = ['red', 'green', 'blue']
    color_value = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]
    color_map = dict(zip(color_key, color_value))
    print sub_dict(color_map, ('red', 'green'))
[kobakoba0723@fedora13-intel64 ~]$ python sub_dict.py 
{'green': (0, 255, 0), 'red': (255, 0, 0)}
[kobakoba0723@fedora13-intel64 ~]$ 

sub_dictメソッドのdict([...])をdict(...)にすることでジェネレータを使うことが出来る。

kobakoba0723@fedora13-intel64 ~]$ cat sub_dict.py 
def sub_dict(whole_dict, part_key, default=None):
    return dict((key, whole_dict.get(key, default)) for key in part_key)

if __name__ == '__main__':
    color_key = ['red', 'green', 'blue']
    color_value = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]
    color_map = dict(zip(color_key, color_value))
    print sub_dict(color_map, ('red', 'green'))
[kobakoba0723@fedora13-intel64 ~]$ python -m pdb sub_dict.py 
> /home/kobakoba0723/sub_dict.py(1)<module>()
-> def sub_dict(whole_dict, part_key, default=None):
(Pdb) s
> /home/kobakoba0723/sub_dict.py(4)<module>()
-> if __name__ == '__main__':
~ 省略 ~
(Pdb) 
> /home/kobakoba0723/sub_dict.py(8)<module>()
-> print sub_dict(color_map, ('red', 'green'))
(Pdb) 
--Call--
> /home/kobakoba0723/sub_dict.py(1)sub_dict()
-> def sub_dict(whole_dict, part_key, default=None):
(Pdb) 
> /home/kobakoba0723/sub_dict.py(2)sub_dict()
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
--Call--
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
--Return--
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->('red', (255, 0, 0))
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
--Call--
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->('red', (255, 0, 0))
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->('red', (255, 0, 0))
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
--Return--
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->('green', (0, 255, 0))
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
--Call--
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->('green', (0, 255, 0))
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->('green', (0, 255, 0))
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
--Return--
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->None
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
--Return--
> /home/kobakoba0723/sub_dict.py(2)sub_dict()->{'green': (0, 255, 0), 'red': (255, 0, 0)}
-> return dict((key, whole_dict.get(key, default)) for key in part_key)
(Pdb) 
{'green': (0, 255, 0), 'red': (255, 0, 0)}
--Return--
> /home/kobakoba0723/sub_dict.py(8)<module>()->None
-> print sub_dict(color_map, ('red', 'green'))
(Pdb) 
--Return--
> <string>(1)<module>()->None
(Pdb)

同じ文が何度も実行されているように見える。。。
なんでだろうか、ジェネレータってこういう実行され方をするんだろうか。

> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->('red', (255, 0, 0))
とか
> /home/kobakoba0723/sub_dict.py(2)<genexpr>()->('green', (0, 255, 0))

Computer Science Unplugged

コンピュータを使わないで、コンピュータサイエンスの勉強をするための教材。
コンピュータサイエンスの勉強と英語の勉強も兼ねてくれそうなすてきな教材なので読み進めてみる。

対象年齢が小学生ということで、カードゲームやパズル感覚で話が展開されていてとても読みやすい。
今日はPart1のうち3つの章を読んだ。

  1. Count the Dots - Binary Numbers
  2. Colour by Numbers - Image Representation
  3. You Can Say That Again! - Text Compression

白黒画像を2進数で表す章のところで、

白白白白黒黒黒黒黒黒黒黒黒黒黒白白白白

を次のように情報量を落として記載していた。

4, 11

面白いなぁと思って調べてみるとランレングス符号化って呼ばれる圧縮方法なのか、これ。
最初の数字が必ず白の連続数を表して、白黒の順で数字が並び、最後の白の連続数は省略する決まりか。

参考サイト

Computer Science Unplugged

Python クックブック 第2版

Python クックブック 第2版