Pythonロゴともろみ先輩

今回は配列・タプル・セット・辞書の使い分けをご説明します。

大規模なプログラムを書こうと思うと,どれかは必ずと言っていいほど現れるので是非使えるようになりましょう。

それでは本題です。

配列・タプル・セット・辞書とは?

まず今回の主題である配列・タプル・セット・辞書が何かということについてお話します。

この4つはデータ構造と言われるもので簡単に言うと

複数の”値”をまとめたもの

です。

今まで「python入門」で扱った変数は全て1つしか値を格納できませんでした。

でも少し規模の大きいプログラムを書くときには多くの値を保持する必要が出てくるためこういった概念を導入するわけです。

ではこれら4つは何が違うのでしょうか。それぞれ特徴がありますので見ていきましょう。

と,その前にミュータブル,イミュータブルな型というキーワードが良く出てきますので先に説明します。

ミュータブルな型とは細かい事を無視して簡単に説明するなら

“値”の追加・変更・削除ができる

ような型のことを指します。厳密にはidとかの話が必要ですが,本記事ではイメージを掴むことを目的にしているので言及しません。

逆にイミュータブルな型は”値”の追加・変更・削除ができ来ない型のことですね。

ではそれぞれの型の特徴の説明です。

配列

配列はリストとアレイという2種類がありますが,ほとんどアレイは使わない(後述するnumpyでは使います)のでここではリストのみの説明です。

リストはミュータブルな型で,最もオーソドックスなデータ構造だと思います。要素(値)の型は統一しなくても大丈夫です。

最初のうちはこれで実現できるか考えてみるのが楽だと思います。

タプル

タプルはイミュータブルな型で,イメージとしては値の操作ができるリストという感じでしょうか。

因みにミュータブルな型のものよりイミュータブルな型のものを利用するほうが若干計算量が減る(計算時間が短くなる)ようです。

セット

セット(set)はその名の通り殆ど数学でいう集合と同じ概念です。

ミュータブルな型なのですが,リストとは違って順序の概念が無く,要素の重複がありません。

辞書

上の3つがvalue(値)のみを格納していたのに対して,辞書型はkeyとvalueを対にして格納しています。

情報を紐づけて格納できるので便利ですね。

4つの型の基本的な使い方

続いてそれぞれの簡単な使い方の説明です。

配列

まず定義するには以下のような書き方をします。

list_sample = [1, "Moromi", 8.2, "s", 1]

このように色々な型の値が混在したものを作ることができます。

ミュータブルな型ですので値の追加や変更,削除ができます。

以下では上のリストに対してそれぞれの操作を行った場合を示します。(=>の右は操作後printしたときの結果です)

・値の追加

list_sample.append(100)
=> [1, "Moromi", 8.2, "s", 1, 100]

・値の変更

list_sample[1] = "Senpy"
=> [1, "Senpy", 8.2, "s", 1]

・値の削除

del list_sample[2]
=> [1, "Moromi", "s", 1]

こんな感じです。1つ注意しないといけないのはpythonは要素の番号(インデックス)が0から始まるというところです。

実はもっと沢山基本操作はありますが今回は紹介しません。

つまり上のリストで言えば0番目の要素が1,1番目の要素が”Moromi”で,といった形です。

インデックスの開始番号が0から始まるか1から始まるかは言語によって異なるので注意してください。

タプル

上のリストと同じ要素でタプルを作ってみましょう。

tuple_sample = (1, "Moromi", 8.2, "s", 1)

定義は同じように出来ますね。ただしタプルはイミュータブルな型ですので値の追加や変更,削除ができません。

実際にやってみましょう。

・値の変更

tuple_sample[1] = "Senpy"

エラーが出て実行できませんね。でも実は下のようなことは出来ます。

・値の追加

tuple_sample = tuple_sample + (100, "T")
=> (1, "Moromi", 8.2, "s", 1, 100, "T")

あれ?イミュータブルな型のはずが値の追加ができてしまいました…

これ実はtuple_sampleに要素を追加したのではなく

新たにtuple_sampleというタプルを作成した

のです。きちんと言うと別idのタプルが出来たという話になります。

値を変えたい場面ではタプルは適していないことがわかるかと思います。

セット

次はセットです。これは少し変わった性質を持っていましたね。

同様の要素でセットを定義してみましょう。

set_sample = {1, "Moromi", 8.2, "s", 1}
=> {8.2, 1, "Moromi", 's'}

よく見るとprintしたとき既に「1」が1つ消えて順番が入れ替わってますね。これはそれぞれセットに重複が許されないこと,順序がないことから生じています。

ミュータブルな型ですが,順序がないため今までのような値の変更はできません。値の追加と削除は以下のとおりです。

・値の追加

set_sample.add(100)
=> {8.2, 1, 100, "Moromi", 's'}

・値の削除

set_sample.remove("s")
=> {8.2, 1, 100, "Moromi"}

こんな感じです。また数学の集合と殆ど同様に集合演算が使用できますが今回は深入りしません。興味がある方は調べてみて下さい。

辞書

最後に辞書型です。今までの物に加えてkeyが必要なので少しだけ中身が変わります。

dic_sample = {"key1" : 1, "key2" : "Moromi", "key3" : 8.2, "key4" : "s", "key5" : 1}

このように対になっているので出力にもkeyのみ,valueのみ,key,valueどちらもという3種類の方法があります。書き方は以下です。

print(dic_sample) # 全体
=> {"key1" : 1, "key2" : "Moromi", "key3" : 8.2, "key4" : "s", "key5" : 1}

print(dic_sample.keys()) # keyのみ
=> {"key1", "key2", "key3", "key4", "key5"}

print(dic_sample.values()) # valueのみ
=> {1, "Moromi", 8.2, "s", 1}

これもミュータブルな型ですので要素の追加,変更,削除もできます。

・要素の追加

dic_sample["key6"] = 100
=> {"key1" : 1, "key2" : "Moromi", "key3" : 8.2, "key4" : "s", "key5" : 1, "key6" : 100}

・要素の変更

dic_sample["key2"] = "Senpy"
=> {"key1" : 1, "key2" : "Senpy", "key3" : 8.2, "key4" : "s", "key5" : 1}

・要素の削除

dic_sample.pop("key3")
=> {"key1" : 1, "key2" : "Senpy", "key4" : "s", "key5" : 1}

上3つとは違い,値にそれぞれkeyを割り振れるので分かりやすくなるかもしれませんね。

まとめ

今回はデータ構造の配列・タプル・セット・辞書について簡単に説明しました。

それぞれに対して使える関数については使いながら調べればすぐ分かると思います。

本記事で,この4つは基本的には同じようなものであって,それぞれ向き不向きがあるんだということを何となく掴んでくれたら嬉しいです。

プログラミングは実際に手を動かしてみるのが上達の近道だと思います。

ある程度基礎が分かったらいろんなプログラムに挑戦してみましょう!

ではまたお会いしましょう!