初めての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}
>>>

配列は使ったことがあるから、リストは何となく想像がつくが、
テーブルの構造を使ったことが無いので、ディクショナリの用途がいまいち掴めない。。。
アルゴリズムを知らないのが原因なんだろうなぁ。