Pythonのススメ6
はじめに
Pythonでプログラムを書くにあたり、文法や言語仕様などの個人的なメモを記載する。今回のネタはコレクション(辞書と集合)。
コレクションには「リスト(list)」「タプル(tuple)」「辞書(dict)」「集合(set)」が含まれる。
辞書(dict)
保持する値をリストやタプルのように順番で管理せず、キー(key)と、それに対応する値(value)で管理する。Javaでいうところの、Mapに(限りなく)似たものと考えるとよい。
辞書の管理は以下のように行う。
dict = {"key1" : "value1", "key2" : "value2", ... , "keyN" : "valueN"}
基本的な使い方
辞書の登録
生成済みの辞書オブジェクトに対して新しいkey-valueを登録する方法は以下の通り。
dict[key名] = value
(Javaでいうところの、Map #putに相当する。)
指定したkey名が辞書に無いのであれば、指定したkey-valueが新規に追加される。
指定したkey名が辞書に既にあるのであれば、それに対するvalueが上書きされる。
サンプルプログラムは以下の通り。
dict = {"name": "Ichiro", "place": "Japan"} # キー"work"は辞書に未登録→キー"work" 値"Engineer"が追加される。 dict["work"] = "Enginerr" print(dict) # キー"work"は辞書に存在する→値が"Engineer"から"Teacher"に上書きされる。 dict["work"] = "Teacher" print(dict)
実行結果は以下の通り。
{'name': 'Ichiro', 'place': 'Japan', 'work': 'Enginerr'} {'name': 'Ichiro', 'place': 'Japan', 'work': 'Teacher'}
キーの有無
inを使うことでキーの有無を確認できる。
(JavaのMap #containsKeyに相当)
(キー名) in 辞書
サンプルプログラムは以下の通り。
# 実行するとコンソール上に"True"が表示される。 print("name" in dict) # 実行するとコンソール上に"False"が表示される。 print("test" in dict)
値の取得
getメソッドで取得できる。
JavaのMap #getに相当。
辞書.get(キー名)
サンプルプログラムは以下の通り。
val = dict.get("name") print(val) # hogeというkeyは無いのでコンソール上にNoneが出力される。 val = dict.get("hoge") print(val) # 指定したキーが登録されていないときにNone以外の値を取得したい場合はgetメソッドの第二引数に任意の値を指定する。 val = dict.get("hoge", "そんなキーは未登録!") print(val)
実行結果は以下の通り。
Ichiro
None
そんなキーは未登録!
全てのkeyを取得/全てのvalueを取得/全てのkey-valueを取得
- keysメソッド
辞書内の全てのkeyを取得。
- valuesメソッド
辞書内の全てのvalueを取得。
- itemsメソッド
辞書内の全てのkey-valueを、要素が2のタプルで取得。
サンプルプログラムは以下の通り。
dict = {"name": "Ichiro", "place": "Japan", "work" : "Teacher"} print("☆全てのkeyを取得して表示") for key in dict.keys(): print(key) print("\n☆全てのvalueを取得して表示") for value in dict.values(): print(value) print("\n☆全てのkey-valueを取得して表示") index_key = 0 index_value = 1 for key_value in dict.items(): print(key_value) print(" - key: " + key_value[index_key] + "/value: " + key_value[index_value])
実行結果は以下の通り。
☆全てのkeyを取得して表示 name place work ☆全てのvalueを取得して表示 Ichiro Japan Teacher ☆全てのkey-valueを取得して表示 ('name', 'Ichiro') - key: name/value: Ichiro ('place', 'Japan') - key: place/value: Japan ('work', 'Teacher') - key: work/value: Teacher
ちなみに、辞書に対してそれぞれkeysメソッド、valuesメソッド、itemsメソッドを実行したときの実行結果は以下の通り。
dict_keys(['name', 'place', 'work']) dict_values(['Ichiro', 'Japan', 'Teacher']) dict_items([('name', 'Ichiro'), ('place', 'Japan'), ('work', 'Teacher')])
dict_keysクラス:
key名が格納されているリストのようなもの。
listメソッドを適用させることでリスト化して管理することができる。
dict_valuesクラス:
valueが格納されているリストのようなもの。
listメソッドを適用させることでリスト化して管理することができる。
dict_itemsクラス:
key-valueのタプルが格納されているリストのようなもの。
listメソッドを適用させることでリスト化して管理することができる。
集合(set)
リストやタプルのように値しか持たないし、順序も持たない。辞書と違ってキーを持たない。
1つの集合内には同じ値が1つしか存在しない。
JavaのSetのようなもの。
基本的な使い方
集合の定義
以下のようにして集合を定義する。
set = {"value1", "value2", ... , "valueN"}
要素の追加
addメソッドを使うことで要素の追加が可能。
サンプルプログラムを以下に示す。
set = {"aaa", "bbb"} set.add("ccc") print(set)
実行結果は以下の通り。
{'ccc', 'aaa', 'bbb'}
要素数の取得
len関数で取得可能。
set = {"aaa", "bbb"} set.add("ccc") # コンソール上に3が出力される。 print(len(set)) set.add("ccc") # コンソール上に3が出力される。 print(len(set))
上記サンプルで示した通り、2回目のlen関数実行により得られる値は3である。
なぜなら、先述の通り、集合内には同じ値は2つ以上格納されないためである。
今回の例の場合、cccという値はすでに存在しているため、2回目のaddで要素は追加されない。
結果、集合setの要素数は4ではなく3となる。
値の有無
inを使うことで値の有無を確認できる。
(JavaのSet #containsに相当)
(value) in 集合
サンプルプログラムは以下の通り。
set = {"aaa", "bbb", "ccc"} # 実行するとコンソール上に"True"が表示される。 print("aaa" in set) # 実行するとコンソール上に"False"が表示される。 print("zzz" in set)
論理積(AND) / 論理和(OR)
2つの集合の論理積をとる際は、2つの集合に対してAND(&)演算子を使う。
set1 = {"aaa", "bbb", "ccc"} set2 = {"bbb", "zzz"} print(set1 & set2)
動作結果は以下の通り。
{'bbb'}
2つの集合の論理和をとる際は、2つの集合に対してOR( | )演算子を使う。
set1 = {"aaa", "bbb", "ccc"} set2 = {"bbb", "zzz"} print(set1 | set2)
動作結果は以下の通り。
{'zzz', 'bbb', 'ccc', 'aaa'}
終わりに
Pythonのコレクション(辞書と集合)について、サンプルプログラムを交えて記載した。辞書はJavaのMapのようなものと考えれば理解しやすい。
valueの取得はgetメソッドを使う。
キーの有無はinを使う。
keysメソッド、valuesメソッド、itemsメソッドにより、それぞれ辞書内のすべてのkey、すべてのvalue、すべてのkey-valueを取得できる。
集合はJavaのSetのようなものと考えれば理解しやすい。
値の追加はaddメソッドを使う。
addの引数に指定した値が、既に集合にある場合、それは集合に追加されない。集合は、同じ値は1つしか存在しない。
集合の論理積をとるときはAND演算子(&)を使う。
集合の論理和をとるときはOR演算子( | )を使う。