2020年12月30日
辞書オブジェクト,セット
記事内容の出典:フリーテキスト「Python3入門」
このページの更新:2020/12/31
辞書オブジェクト(dict型)
辞書オブジェクトは「キー」と「値」の対応を保持するデータ構造で,文字通り「辞書」のような働きをします.例えば,文字列 'apple' に文字列 'りんご' を,'orange' に 'みかん' を対応させる辞書を作るには次のようにします.
d = { 'apple':'りんご', 'orange':'みかん' }
これで辞書オブジェクトが変数 d に与えられました.この辞書 d を用いてキー 'apple' から値を得るには d['apple'] とします.(次の例)
d['apple']
実行結果:
'りんご'
辞書に登録する「キー」と「値」のペアをエントリと呼びます.
エントリの参照,追加,削除
辞書に新たなエントリを登録するには
辞書[ キー ] = 値
とします.先の辞書 d にエントリを追加する例を次に示します.
d['grape'] = 'ぶどう'
print( d )
実行結果:
{'apple': 'りんご', 'orange': 'みかん', 'grape': 'ぶどう'}
エントリ 'grape':'ぶどう' が追加登録されていることがわかります.
■ 辞書を参照する際の注意
存在しないエントリにアクセスするとエラーが発生します.(次の例)
d['banana']
実行結果:
KeyError Traceback (most recent call last)
〈ipython-input-136-4f55cd2dbce8〉 in()
----> 1 d['banana']
KeyError: 'banana'
KeyError というエラーが発生しています.存在しないエントリを参照する可能性がある使い方をする場合は get メソッドを使います.(次の例)
print( d.get('banana') )
実行結果:
None
エラーは発生せずに None というものが得られています.
■ None(ヌルオブジェクト)
None は「何もない」ことを意味する特殊なオブジェクト(ヌルオブジェクト)で,Python プログラミングではしばしば登場するので覚えておいてください.None は真理値ではありませんが if 文などで条件式として使用することができます.(次の例)
if d.get('banana'):
print('エントリが存在します.')
else:
print('エントリが存在しません.')
実行結果:
エントリが存在しません.
■ del 文によるエントリの削除
辞書のエントリは次のようにして del 文で削除することができます.
del 辞書[ キー ]
先の辞書 d から 'grape' のキーを持つエントリを削除する例を示します.
del d['grape']
print( d )
実行結果:
{'apple': 'りんご', 'orange': 'みかん'}
参考)辞書オブジェクトに対して clear() メソッドを実行すると,内容を一度に空にすることができます.
エントリの個数の調査
辞書に登録されているエントリの個数は len 関数で調べることができます.(次の例)
len( d )
実行結果:
2
2個のエントリが存在していることがわかります.
空の辞書の作成
Pythonプログラミングでは,空の辞書に次々とエントリを登録してゆく処理を行うケースがあります.空の辞書は辞書コンストラクタ dict() もしくは { } で作成することができます.(次の例)
d = {}
len( d )
実行結果:
0
セット(set型)
集合論でいうところの「集合」に近いデータ構造としてセットがあります.その名の通り集合に対する各種の操作ができるデータ構造で,要素の探索も非常に早いです.セットは要素をコンマで区切って列挙し,それらを { } の括弧で括ります.
セットの特徴としては
1) 要素に順序の概念がない
2) 要素の重複が許されない
ということがあります.これらのことを以下の例で示します.
s = {4,1,3,2,1,3,4,2}
print( s )
実行結果:
{1, 2, 3, 4}
重複する要素を書き並べても重複が排除された形になっています.
セットには順序の概念がありませんので,スライス [n] によるアクセスはできません.(次の例)
s[1]
実行結果:
TypeError Traceback (most recent call last)
〈ipython-input-151-f8bb2b116405〉 in()
----> 1 s[1]
TypeError: 'set' object does not support indexing
スライスを付けて要素を参照しようとしてエラーとなっています.
上の例では,セット s の要素が値の順に並んでいるように見えますが,くれぐれもセットには順序の概念はありません.ただし厳密には「Python処理系独自の順序で要素が保持される」ということです.(次の例)
s = {1, 4, 9, 16, 25, 36, 49, 64, 81, 100}
print( s )
実行結果:
{64, 1, 4, 36, 100, 9, 16, 49, 81, 25}
不思議な順序で値が並んでいますが,同じ処理系のPythonではセットの値の格納順序は同じものになります.
要素の存在検査
次のようにして in 演算子で酒豪に要素が含まれるかどうかを検査することができます.
要素 in 集合
実行例を下に示します.
s = {0,1,2,3}
print( 2 in s )
実行結果:
True
空のセットの作成
空のセットを作成するにはセットコンストラクタ set() を使用します.ここで注意が必要なこととして,空のセットは { } ではないということです.{ } はあくまで「空の辞書」ですので間違えないようにしてください.
要素の追加と削除
セットに要素を追加するには add メソッド,削除するには discard メソッドを使用します.
対象のセット.add( 要素 )
対象のセット.discard( 要素 )
空のセットに要素を追加,削除する例を次に示します.
s = set()
print( s )
s.add('a')
print( s )
s.add('b')
print( s )
s.add('c')
print( s )
s.discard('a')
print( s )
s.discard('b')
print( s )
s.discard('c')
print( s )
実行結果:
set()
{'a'}
{'b', 'a'}
{'b', 'a', 'c'}
{'b', 'c'}
{'c'}
set()
参考)セットに対して clear() メソッドを実行すると,内容を一度に空にすることができます.
集合論の操作
セットでは集合論の演算ができます.
S1 | S2 S1とS2の和集合 (1)
S1 & S2 S1とS2の共通集合 (2)
S1 ^ S2 (1) から (2) を取り除いた集合
S1 - S2 S1 から (2) を取り除いた集合
これらの実行例を下に示します.
print( '和集合:', {1,2,3} | {2,3,4} )
print( '共通集合:', {1,2,3} & {2,3,4} )
print( '和集合から共通集合を除いたもの', {1,2,3} ^ {2,3,4} )
実行結果:
和集合: {1, 2, 3, 4}
共通集合: {2, 3}
和集合から共通集合を除いたもの {1, 4}
集合の差:
print( {1,2,3} - {2,3,4} )
print( {2,3,4} - {1,2,3} )
実行結果:
{1}
{4}
更に多くの演算がメソッドの形で実行できます.(下の表)
(表の出典:フリーテキスト「Python3入門」)
部分集合,真部分集合の判定
大小比較の演算子を用いることで部分集合,真部分集合の判定ができます.
S1 <= S2 S1はS2の部分集合
S1 < S2 S1はS2の真部分集合
これに関する実行例を下に示します.
print( {2,4,6} <= {1,2,3,4,5,6} )
print( {1,2,3} <= {1,2,3} )
print( {1,2,3} < {1,2,3} )
実行結果:
True
True
False
自分自身は自分自身の部分集合ではありますが,真部分集合でないことが確認できています.
Python3 の基礎 − 超入門・再入門 −
【このカテゴリーの最新記事】
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/10439507
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック