辞書(dict型)はキーと値を組み合わせたデータをまとめたデータ構造である。辞書は{}で囲み、そこに「key: value」形式でデータを記述していく。あるいは個々の要素が2つの要素で構成される反復可能オブジェクトや、辞書を組み込み関数dictに渡すことでも辞書を作成できる。
d = {'key': 'value', 'foo': 'bar' } # 直接的な辞書の作成
print(d) # 出力結果(例): {'key': 'value', 'foo': 'bar'}
d = dict(foo='foo', bar='bar') # 組み込み関数dictにキーと値を指定して作成
print(d) # 出力結果(例): {'bar': 'bar', 'foo': 'foo'}
d = { chr(x + ord('a')): x + ord('a') for x in range(5) } # 内包表記による作成
print(d) # 出力結果(例): {'a': 97, 'b': 98, 'd': 100, 'c': 99, 'e': 101}
l = [tuple((chr(x + ord('a')), x + ord('a'))) for x in range(5)]
print(l) # 出力結果: [('a', 97), ('b', 98), ('c', 99), ('d', 100), ('e', 101)]
d = dict(l) # リストから辞書を作成
print(d) # 出力結果(例): {'a': 97, 'b': 98, 'd': 100, 'c': 99, 'e': 101}
辞書に行える操作を以下に示す(一部)。辞書でも、上で見た長さの取得、存在確認などがサポートされている。
操作 | 説明 |
---|---|
len(d) | 辞書dの項目数を取得 |
d[key] | keyに対応する値を取得。keyがなければKeyError例外が発生する |
d[key] = new_value | keyに対応する値を変更する |
del d[key] | キーに対応する値を削除 |
k in d k not in d |
辞書dでのキーkの有無を確認 |
d.clear() | 辞書dの全要素を削除 |
d.copy() | 浅いコピーを作成 |
d.get(key[, default]) | 辞書dからkeyに対応する値を取得。keyがなければdefaultの値が返される(デフォルト値はNone) |
d.items() | 辞書dからキー/値を要素とするビューオブジェクトを作成(forループなどで使用) |
d.keys() | 辞書dからキーを要素とするビューオブジェクトを作成 |
d.pop(key[, default]) | 指定したkeyの値を辞書dから削除 |
d.values() | 辞書dから値を要素とするビューオブジェクトを作成 |
d.update(other) | 辞書dをotherで更新 |
辞書dに対する操作 |
以下に例を示す。
print(d) # 出力結果(例): {'a': 97, 'b': 98, 'd': 100, 'c': 99, 'e': 101}
print(d['a']) # 出力結果: 97
print(d['z']) # d[key]形式ではkeyが存在しないとKeyErrorが発生する
# 出力結果:
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# KeyError: 'z'
# d.get(key)ではkeyが存在しないと(デフォルトで)Noneが戻る
print(d.get('z')) # 出力結果: None
print(d.get('a')) # 出力結果: 97
print('c' in d) # 存在確認。出力結果: True
# 辞書のキー/値の組に対して反復処理
for k, v in d.items():
print(k, v)
# 出力結果(例):
# a 97
# b 98
# d 100
# c 99
# e 101
# 辞書のキーに対して反復処理
for k in d.keys():
print(k, d[k])
# 出力結果(例):
# a 97
# …… 省略 ……
d['f'] = 102 # 辞書に要素を追加
print(d) # 出力結果(例): {'c': 99, 'e': 101, 'a': 97, 'b': 98, 'f': 102, 'd': 100}
del d['f'] # 辞書から要素を削除
print(d) # 出力結果: {'c': 99, 'e': 101, 'a': 97, 'b': 98, 'd': 100}
# 2要素のタプルを要素とする別のリスト
l2 = [tuple((chr(x + ord('a')), x + ord('a'))) for x in range(5,10)]
print(l2) # 出力結果: [('f', 102), ('g', 103), ('h', 104), ('i', 105), ('j', 106)]
d.update(l2) # そのリストを基に辞書を更新
print(d) # 出力結果(例): {'i': 105, 'g': 103, 'h': 104, 'c': 99, 'e': 101, 'a': 97, 'b': 98, 'f': 102, 'd': 100, 'j': 106}
d.update(k=107) # キーと値を指定して辞書を更新
集合は要素の重複を許さず、また順序性を持たないデータ構造である。ある値が集合に存在するかを確認したり、集合演算を行ったりする際に使用できる。Python 3では要素を変更可能な集合(set型)と、要素の変更が不可能な集合(frozenset型)がある。変更可能な集合(set型)は辞書と同じく{}で囲んで、その集合に含まれる値のみを記述していく。あるいは組み込み関数setや集合の内包表記を使っても作成できる。frozenset型の集合は既存の反復可能オブジェクトを基に組み込み関数frozensetを使用して作成する。
s = {'a', 'b', 'c'} # 直接的な集合の作成
print(s) # 出力結果(例): {'a', 'b', 'c'}
s = {chr(x + ord('a')) for x in range(5)} # 内包表記による作成
print(s) # 出力結果(例): {'a', 'b', 'd', 'c', 'e'}
l = list(range(5))
print(l) # 出力結果: [0, 1, 2, 3, 4]
s = set(l) # リストを基に組み込み関数setを使って集合を作成
print(s) # 出力結果(例): {0, 1, 2, 3, 4}
frset = frozenset(s) # 変更不可能な集合の作成
print(frset) # 出力結果(例): frozenset({0, 1, 2, 3, 4})
集合に対しては、多様な集合演算が提供されている。また、要素数を取得する組み込み関数len、要素の存在確認を行うin演算子も利用できる。以下に集合で行える操作を示す。これらはset型/frozenset型のいずれでも行える。
操作 | 説明 |
---|---|
len(s) | 集合sの要素数を求める |
x in s x not in s |
集合sに要素xが含まれているか否かを確認 |
s1.isdisjoint(s2) | 集合s1と集合s2が互いに素か |
s1.issubset(s2) s1 <= s2 |
集合s1が集合s2の部分集合か |
s1 < s2 | 集合s1が集合s2の真部分集合か(s2がs1の全ての要素に加えて別の要素を持つか) |
s1.issuperset(s2) s1 >= s2 |
集合s1が集合s2の上位集合か(s1がs2を包含しているか) |
s1 > s2 | 集合s1が集合s2の真上位集合(s1がs2の全ての要素に加えて別の要素を持つか) |
s1.union(s2) s1 | s2 |
集合s1と集合s2の和 |
s1.intersection(s2) s1 & s2 |
集合s1と集合s2の積 |
s1.difference(s2) s1 - s2 |
集合s1と集合s2の差 |
s1.symmetric_difference(s2) s1 ^ s2 |
集合s1と集合s2の対称差(いずれかにのみ含まれる要素) |
s.copy() | 集合sの浅いコピーを作成 |
変更可能な集合と変更不可能な集合に共通する操作 |
以下に例を示す。
s1 = set(range(5))
s2 = set(range(5, 10))
s3 = set(range(10))
print(s1) # 出力結果: {0, 1, 2, 3, 4}
print(s2) # 出力結果: {8, 9, 5, 6, 7}
print(s3) # 出力結果: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
print(s1.issubset(s3)) # 出力結果: True
print(s1.isdisjoint(s2)) # 出力結果: True
s4 = set(range(5)) # s1と同じ要素からなる別の集合
print(s4) # 出力結果: {0, 1, 2, 3, 4}
print(s1 <= s4) # 出力結果: True(s1はs4の部分集合だが)
print(s1 < s4) # 出力結果: False(真部分集合ではない)
print(s1 >= s4) # 出力結果: True(s1はs4の上位集合だが)
print(s1 > s4) # 出力結果: False(真上位集合ではない)
print(s1.union(s2)) # 出力結果: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
print(s1.intersection(s3)) # 出力結果: {0, 1, 2, 3, 4}
print(s3.difference(s1)) # 出力結果: {8, 9, 5, 6, 7}
s5 = set(range(6))
print(s1.symmetric_difference(s5)) # 出力結果: {5}
変更可能な集合(set型)では以下の操作も行える。
操作 | 説明 |
---|---|
s1.add(x) | 集合sに要素xを追加 |
s.remove(x) | 集合sから要素xを削除(なければKeyErrorが発生) |
s.discard(x) | 集合sに要素xがあれば削除(なくても例外は発生しない) |
s.pop() | 集合sから任意の要素を取り出して削除 |
s.clear() | 集合sの全要素を削除 |
s1.update(s2) s1 |= s2 |
集合s1に集合s2を追加 |
s1.intersection_update(s2) s1 &= s2 |
集合s1の要素をs1とs2の積とする |
s1.difference_update(s2) s1 -= s2 |
集合s1の要素を集合s2との差にする |
s1.symmetric_difference_update(s2) s1 ^= s2 |
集合s1の要素を集合s2との対称差にする |
変更可能な集合sで可能な操作 |
以下に例を示す。
print(s1) # 出力結果: {0, 1, 2, 3, 4}
s1.add(5) # s1に要素「5」を追加
print(s1) # 出力結果: {0, 1, 2, 3, 4, 5}
# s1.remove(6) # removeメソッドは要素がないとKeyErrorを発生する
# 出力結果:
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# KeyError: 6
s1.discard(6) # discardメソッドは要素がなくてもKeyErrorとならない
print(s2) # 出力結果: {8, 9, 5, 6, 7}
s1 |= s2 # s1の要素をs1とs2の和にする
print(s1) # 出力結果: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
次ページでは、制御構造や関数定義、例外処理についてまとめる。
Copyright© Digital Advantage Corp. All Rights Reserved.