Statistical Programming

Python Introduction part2

基本的なコレクションの一つであるStringについて。

PythonのStringはScalaのものと比べるとCharの連続したものであるということがより伝わってくる。気がする…PythonのListとStringの大きな違いとしてmutablityがある。Listはmutableな一方でStringはimmutable。len()など基本的なメソッドはListとかぶっているけどcenter(),rjust(),ljust()メソッドとかがあまりなじみないな。center()はintを受け取り、(その数値ーStringの文字列)/2の分だけ両側に空白を作る。rjust,ljustはそれぞれ左、右どちらかにその空白を偏らせる。ただし、上の3つのメソッドは引数の数値が文字列の長さ以下の時、何も起こらない

name="david"
=>"david"
name[0]
=>"d"
name.upper()
=>"DAVID"
name.center(10)
=>"  david   "
name.rjust(10)
=>"     david"
name.ljust(10)
=>"david     "
name.find("a")
=>1  //indexを教えてくれる
name.split("a")
=>["d","vid"]

splitは文字列を受け取りその文字列をStringから取り除き残ったStringを前後に分断してList化するメソッド。もし仮に受け取る文字列が調べるStringと一致していなかったら何も行われない(例えば引数が"av"なら機能するが"ai"なら何もしない)。ちなみにもし受け取る引数が調べるStringの末尾の部分ならリストの中の後ろの要素は空のStringが渡される。
続いてTupleについて。これはListとかなり似ているのだけど、こちらはimmutable.

tp=(1,2,True,5.5)
len(tp)
=>4
tp[0:3:1]   //index3は含まない
=>1,2,True

次はSet。setは順序のないTuple.ただしimmutableなオブジェクトを格納するコレクションなだけであってコレクション自体はmutable。setは{ }で囲う。順序がないからインデックスをどうこうはできないけどその代わり記号を使ったわかりやすいメソッドがある。イメージ的にはsetは集合みたいなかんじだなあ。基本的に重複しないのかな… A | B はAとBの和集合的な(重複しない)。A & B はAとBに共通する要素の集合。A-BはAからBに含まれる要素を差し引いた要素の集合。最後のA<=BはBがAを包括しているかどうかを確認するためのメソッドといったところか。

st={5.5,True,2}
st2=>{7,False,5.5,2}
st | st2
=>{5.5,True,2,False,7}
st & st2
=>{5.5,2}
st2-st
=>{7,False}
st <= st2
=>False

たぶんだけど記号のメソッドは実際にはそれぞれに対応しているメソッドに変換されていると思われる。例えば A | B は A.union(B) 、A & B は A.intersection(B)、A - B は A.difference(B) 、A <= B は A.insubset(B) へと変換されている。たぶん。 add(),remove(),pop()等のメソッドも使用出来、clear()メソッドも実装されている。これはその名の通り。
最後のコレクションはdictionary。これはScalaでいうMapコレクション。Mapだからもちろん順序が存在しない。純粋にkey-valueの関係だけ。基本的ScalaのMapと酷似してるから問題ないとおもう。要素の削除と追加は以下の感じ。

capitals={"Hokkaido":"Sapporo","Tokyo":"Tokyo"}
del capitals["Hokkaido"]
=>{"Tokyo":"Tokyo"}
capitals["Hokkaido"]="Sapporo"
=>{"Hokkaido":"Sapporo","Tokyo":"Tokyo"}

要素の参照は2通りあり、dic[key]の場合もし対応するkeyが存在してない場合エラーとなるがdic.get(key)を使えば何も返されずエラーが起きない。dic.get(key, alternative objects)、このようにさらに引数を一つ追加すると対応するkeyが発見されなかった時に返す値をしてして受け取ることが出来る。

capitals["Hokkaido"]
=>"Sapporo"  
capitals.get("Hokkaido")
=>"Sapporo"  

"Hokkaido" in capitals // keyのみ調べる
=>True

for k  in capitals:
   print("key: "+k+", value: "+capitals[k])
=>key: Hokkaido, value: Sapporo
=>key: Tokyo, value: Tokyo

capitals.keys()
=>["Hokkaido","Tokyo"]  //keyのListが返される。
capitals.values()
=>["Sapporo","Tokyo"]
capitals.items()
=>[("Hokkaido","Sapporp"),("Tokyo","Tokyo")]     //List[Tuple(T,T)]の形で返される