目次記事
前の記事
この記事ではコンテナオブジェクトをもうちょい深堀します。
シーケンス
リスト、タプル、文字列をシーケンスオブジェクト(順序を持つ一続きのモノ) と言います。まずはシーケンスに共通する演算を見ていきます。
連結 +
と繰り返し *
シーケンスは +
で連結、*
で繰り返しを行うことが可能です。ただし、連結と繰り返しは同一の型に対してのみ実行可能です。例えば、リストとタプルを連結しようとすると、TypeError: can only concatenate list (not "tuple") to list
という例外が発生します。
では、連結と繰り返しを実際にやってみます。
>>> foo = ["佐藤", "田中"] # リストオブジェクトを作成
>>> foo2 = ["阿部"] + foo + ["山田"] # リスト["阿部"] とfoo とリスト["山田"]を連結
>>> foo2
['阿部', '佐藤', '田中', '山田']
>>> bar = (1, 2) # タプルオブジェクトを作成
>>> bar2 = bar * 3 # bar を3回繰り返してできるタプルをbar2に代入
>>> bar2
(1, 2, 1, 2, 1, 2)
>>> baz = "Hello, " # 文字列オブジェクトを作成
>>> baz2 = baz * 2 + "how are you?" # baz を2回繰り返して、さらに"how are you?"を連結
>>> baz2
'Hello, Hello, how are you?'
シーケンスオブジェクトにはインデックスという概念が存在します。これを利用してスライスという作業を行うことができます。
シーケンスのスライスとはインデックスを利用して複数の要素にまとめてアクセスするものです。書き方は [開始インデックス:終了インデックス:増分値]
です。
はじめの要素のインデックスは 0
で、負の値をインデックスに指定すると末尾から何番目って意味になります。
スライス形式のインデックスや増分値は省略すると、[0:-1:1]
(先頭から末尾まで1ずつ増加してスライス)となる
>>> str = "こんにちは、世界!" # 文字列オブジェクトを作成
>>> str[2] # 文字列のインデックスが2の要素にアクセス(インデックスは0からスタート)
'に'
>>> str[-1] # 末尾の要素にアクセス
'!'
>>> str[-2] # 末尾から一つ手前の要素にアクセス
'界'
>>> str[::] # strの先頭から末尾まで、1ずつ増分して作成したリストを表示
'こんにちは、世界!'
>>> str[::2] # strの先頭から末尾まで、2ずつ増分して作成したリストを表示
'こには世!'
>>> str[0:-2:2] # strの先頭(0)から末尾の一つ手前(-2)まで、2ずつ増分して作成したリストを表示
'こには世'
変更可能(ミュータブル)なオブジェクトであるリストについて、スライスを利用すると複数の要素をまとめて置換することもできます。
>>> int_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> odd_list = int_list[::2] # 先頭から2ずつ増加したint_listのスライス
>>> odd_list
[1, 3, 5, 7, 9]
>>> odd_list[:2:] = ["いち", "Three"] # odd_listの先頭から2つの要素を置き換え
>>> odd_list
['いち', 'Three', 5, 7, 9]
また、リストでは del
文を利用することで、スライスで指定したすべての要素をまとめて削除することができます。
>>> int_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> del int_list[2:-1:2] # 2番目のインデックスの要素(3)から末尾まで2ずつ増加
>>> int_list
[1, 2, 4, 6, 8, 10]
集合(Set)
集合(Set) はコンテナオブジェクトの一つで、要素の重複を許さず、順序構造を持たないという特徴を持ちます。集合を作成するには {}
を使用します。
>>> RGB = {"red", "green", "blue"} # 集合の作成
>>> RGB # 要素を表示。順序は保持されない。
{'blue', 'red', 'green'}
>>> test_set = {1, 2, 3, 1, 3, 1} # 重複する要素を持つ集合を作成
>>> test_set # 要素を表示。同じデータは複数回現れない。
{1, 2, 3}
要素の追加、削除
要素が何もない空集合の作成には set()
を使用します。
要素の追加には add()
を使用します。add()
で追加できる要素は常に一つです。
また要素を削除するには remove()
か discard()
を使用します。どちらも指定した要素を一つ削除しますが、remove()
では指定した要素がないときに例外を投げます。対して discard()
は指定した要素がなくても例外が送出されません。
>>> members = set() # 空集合を作成
>>> members # membersの要素を表示
set()
>>> members.add("阿部") # membersに "阿部" という要素を追加
>>> members # membersの要素を表示
{'阿部'}
>>> members.add("佐藤", "田中") # addに複数の引数を与えるとエラーになる
Traceback (most recent call last):
File "<python-input-8>", line 1, in <module>
members.add("佐藤", "田中")
~~~~~~~~~~~^^^^^^^^^^^^^^^^
TypeError: set.add() takes exactly one argument (2 given)
集合演算
集合には順序構造(インデックス)も、重複したデータもないという特徴があります。このおかげで、集合にのみ許された特別な演算、集合演算というものが可能です。
- 二つの集合の要素をまとめた集合を求めるには
|
(和集合) - 二つの集合の差を求めるには
-
(差集合) - 二つの集合の共通部分を求めるには
&
(積集合) - 二つの集合の共通部分以外の集合を求めるには
^
(対称差)
以下で二つの集合 {1, 2, 3}
と {2, 3, 4}
を例に集合演算をやってみます。
>>> {1, 2, 3} | {2, 3, 4} # {1, 2, 3}と{2, 3, 4}の和(重複は除かれる)
{1, 2, 3, 4}
>>> {1, 2, 3} - {2, 3, 4} # {1, 2, 3}と{2, 3, 4}の差
{1}
>>> {1, 2, 3} & {2, 3, 4} # {1, 2, 3}と{2, 3, 4}の共通部分
{2, 3}
>>> {1, 2, 3} ^ {2, 3, 4} # {1, 2, 3}と{2, 3, 4}の共通部分以外
{1, 4}
辞書(dictionary)
辞書(dictionary) もコンテナオブジェクトの一つです。リストが「インデックス」という整数値で要素を管理するのに対し、辞書では「キー(key)」で値を管理します。Python3.7以降の辞書は、追加された順を参考に順序構造を保持します。
辞書の作成は集合と同じく {}
を使用します。
下記のコードは、キーに「色の名前」、値に「その色のカラーコード(リストで表現)」としたときの辞書の例です。
>>> colors = {"red":[255, 0, 0], "green":[0, 255, 0], "gray":[128, 128, 128]}
辞書の要素の追加など
辞書の要素にアクセスする場合、[]
の中にキーを指定します。
>>> colors["gray"]
[128, 128, 128]
辞書に新たな要素を追加したい、変更したい場合は下記のように書きます。
>>> colors # colors辞書の要素を表示
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128]}
>>> colors["yellow"] = [255, 1, 0] # yellow を追加
>>> colors # colors辞書の要素を表示。"yellow":[255, 1, 0] が追加されてる
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128], 'yellow': [255, 1, 0]}
>>> colors["yellow"] = [255, 255, 0] # "yellow"の値を[255, 255, 0]に変更
>>> colors # colors辞書の要素を表示。"yellow":[255, 255, 0] になってる
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128], 'yellow': [255, 255, 0]}
(Python の辞書の書き方はJSONに非常に近いです。ほかの言語でMapとか勉強した人はなじみやすそうですね。)
辞書の結合
辞書は |
で別の辞書と結合することができます。
>>> colors
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128], 'yellow': [255, 255, 0]}
>>> colors | {"ivory":[255, 255, 240], "indigo":[75, 0, 130]} # 別の辞書と結合
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128], 'yellow': [255, 255, 0], 'ivory': [255, 255, 240], 'indigo': [75, 0, 130]}
これは集合の演算と似ていますね。なお、集合の場合もそうですが結合した結果をもとの辞書に代入したければ |=
を利用します。
>>> colors | {"ivory":[255, 255, 240], "indigo":[75, 0, 130]} # colorsは変化しない
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128], 'yellow': [255, 255, 0], 'ivory': [255, 255, 240], 'indigo': [75, 0, 130]}
>>> colors # 中見てみると変化してないことがわかる
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128], 'yellow': [255, 255, 0]}
>>> colors |= {"ivory":[255, 255, 240], "indigo":[75, 0, 130]} # これなら変化する
>>> colors # やっぱり変化してる
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128], 'yellow': [255, 255, 0], 'ivory': [255, 255, 240], 'indigo': [75, 0, 130]}
辞書の要素の削除
辞書の要素を削除するには 'del' 文か pop()
, popitem()
を利用します。del
文の使い方は前に説明したものと同じです。pop()
は集合の remove()
と似たようなもので、削除したうえで削除した要素が何だったのかリターンします。
popitem()
は末尾の要素を削除したうえで、キーと値をリターンします。
>>> colors # colorsの要素を表示
{'red': [255, 0, 0], 'green': [0, 255, 0], 'gray': [128, 128, 128], 'yellow': [255, 255, 0], 'ivory': [255, 255, 240], 'indigo': [75, 0, 130]}
>>> colors.pop("gray") # キーが"gray"の要素を削除
[128, 128, 128]
>>> colors # "gray"が消えた!
{'red': [255, 0, 0], 'green': [0, 255, 0], 'yellow': [255, 255, 0], 'ivory': [255, 255, 240], 'indigo': [75, 0, 130]}
>>> colors.popitem("indigo") # popitemには引数を指定できない。
Traceback (most recent call last):
File "<python-input-35>", line 1, in <module>
colors.popitem("indigo")
~~~~~~~~~~~~~~^^^^^^^^^^
TypeError: dict.popitem() takes no arguments (1 given)
>>> colors.popitem() # popitemを使用すると、辞書の末尾のデータが消える。キーと値がリターンされる
('indigo', [75, 0, 130])
>>> colors.popitem() # もう一度実行するとまた末尾のデータが消える
('ivory', [255, 255, 240])
>>> colors # 末尾のデータが二つ消えている!
{'red': [255, 0, 0], 'green': [0, 255, 0], 'yellow': [255, 255, 0]}
>>> del colors["red"] # del文で特定の要素や、複数の要素を削除可能
>>> colors
{'green': [0, 255, 0], 'yellow': [255, 255, 0]}
辞書の要素へのアクセス
辞書オブジェクトの要素へのアクセスは少し癖があります。
- 辞書オブジェクトのキー全体にアクセスするには
keys()
- 辞書オブジェクトの値全体にアクセスするには
values()
- 辞書オブジェクトのキーと値の全体にアクセスするには
items()
これら(keys(), values(), items()
)は評価の結果、イテラブルオブジェクトを返します。
>>> colors = {"red": [255, 0, 0], "green": [0, 255, 0], "yellow": [255, 255, 0]}
>>> colors.keys() # キーのリスト
dict_keys(['red', 'green', 'yellow'])
>>> colors.values() # 値のリスト
dict_values([[255, 0, 0], [0, 255, 0], [255, 255, 0]])
>>> colors.items() # キーと値のペアをタプルにしたリスト
dict_items([('red', [255, 0, 0]), ('green', [0, 255, 0]), ('yellow', [255, 255, 0])])
次の記事