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
そんなキーは未登録!
素数の取得

len関数で取得可能。

dict = {"key" : "value1"}

# コンソール上に1が出力される。
print(len(dict))
全ての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演算子( | )を使う。