特集
» 2016年10月28日 05時00分 公開

TensorFlowやChainerに興味があるけど、Python未経験の技術者が最低限知っておいた方がいい基礎文法まとめ特集:タイニーレファレンス(4/6 ページ)

[かわさきしんじ,Insider.NET編集部]

辞書

 辞書(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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。