初めてのPython(8章)
リストとディクショナリは『オブジェクトの集合』で、あらゆるオブジェクトを無限にネスト出来る。
リストとは?
- mutableなシーケンスの一種
- 処理結果はオブジェクト自身を変更する(返り値として新しいオブジェクトは出来ない)
- 例外的に連結操作の場合は新しいオブジェクトが出来る
- オブジェクトを左から右に一定の順序で並べたもの
- オフセットを使って要素にアクセスする
- インデクシング、スライシングなどが可能(挿入、削除、置換に使える)
ディクショナリとは?
- mutableな写像
- 処理結果はオブジェクト自身を変更する(返り値として新しいオブジェクトは出来ない)
- オブジェクトの順序には意味がない
- 位置情報が無いので、連結・スライシングは出来ない
- キーを使って要素にアクセスする
リストで可能な操作
help(list)で使用可能なメソッドが表示される。
シーケンス共通の操作(インデクシング、連結、反復)に加えて、ソート・要素の追加/削除などが出来る
スライシングを使えば追加・削除の処理が出来るが煩雑
append/insert/extend・removeなどのメソッドを使うべき
ただ、置換処理はメソッドだと大変そうなのでスライシングかな(インデックスを割り出して、削除して、追加になりそう)
>>> sample = [1, 2, 3] >>> sample.insert(0, 0) >>> sample [0, 1, 2, 3] >>> sample.insert(1, 0.5) >>> sample [0, 0.5, 1, 2, 3] >>> sample.append(3.5) >>> sample [0, 0.5, 1, 2, 3, 3.5] >>> sample.extend([4.0, 4.5]) >>> sample [0, 0.5, 1, 2, 3, 3.5, 4.0, 4.5] >>> sample.remove(0) >>> sample.insert(0, 0.0) >>> sample [0.0, 0.5, 1, 2, 3, 3.5, 4.0, 4.5] >>> sample[2:5] = [1.0, 2.0, 3.0] >>> sample [0.0, 0.5, 1.0, 2.0, 3.0, 3.5, 4.0, 4.5] >>>
1個だけの置換ならインデックス指定して上書きすればいいのか。。。あう。
リストでスタック/キューを作るには、
種類 | 操作 | リスト上での処理 |
---|---|---|
スタック | push | list.append() |
^ | pop | list.pop() |
キュー | enqueue | list.append() |
^ | denqueue | list.pop(0) |
ディクショナリで可能な操作
help(dict)で使用可能なメソッドが表示される。
要素の追加と置換が同一の構文で実行されるため注意が必要(代入構文でキーが存在しなければ追加、存在すれば置換)
シーケンスと違いオブジェクト順序は意味を持たないので、追加する場所によらず一定の方法(代入 or updateメソッド)
要素の取り出しはpopメソッドを使うが、引数にキーの指定が必要(場所による管理をしていないので、どの要素を取り出すか判らない)
>>> sample = {'egg':2, 'spam':1, 'bacon':0} >>> sample['ham'] = 1 >>> sample {'bacon': 0, 'egg': 2, 'ham': 1, 'spam': 1} >>> sample['ham'] = 0 >>> sample {'bacon': 0, 'egg': 2, 'ham': 0, 'spam': 1} >>> add_dict = {'muffin':0, 'sausage':1} >>> sample.update(add_dict) >>> sample {'sausage': 1, 'muffin': 0, 'ham': 0, 'spam': 1, 'bacon': 0, 'egg': 2} >>> 'egg' in sample True >>> sample.pop('egg') 2 >>> sample {'sausage': 1, 'ham': 0, 'spam': 1, 'muffin': 0, 'bacon': 0} >>>
配列は使ったことがあるから、リストは何となく想像がつくが、
テーブルの構造を使ったことが無いので、ディクショナリの用途がいまいち掴めない。。。
アルゴリズムを知らないのが原因なんだろうなぁ。