こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。
Pythonのデータ型には数値を扱うint型、float型と、文字列型を扱うstr型などがありますが、それらを束ねるためのデータ型であるコレクション系にはリスト(list)、辞書(dict)、タプル、(tuple)、集合(set)があります。
今回はリスト(list)、辞書(dict)、タプル、(tuple)、集合(set)にいついてお話をしたいと思います。
■コレクション型のそれぞれの特徴
Pythonの標準のデータ型には数値を扱うint型やfloat型、文字列型を扱うstr型などがありますが、これらを束ねるためのデータ型として、リスト(list)、辞書(dict)、タプル、(tuple)、集合(set)があります。
これらは自分自身を入れられるもあり、リストの中にさらにリストを入れる入れ子構造になっていることもあります。
この4つの中で必ず覚えておかなければならない重要なものはリストと辞書です。この2つの使い方を覚えてから、タプルと集合の学習をすると効率的に学習が進むかと思います。ちなみに、リストとタプルはほぼ近いものと言えるような構造になっています。
まずはそれぞれのデータ型の特徴を捉えてみましょう。
記述例 | 特徴 | |
リスト(list) | [a, b, c ,d] | ・順番を維持して要素を格納 ・要素の追加・削除可 ・文字列、数値の混在可 ・Pythonのオブジェクトなら何でも入れられる |
辞書(dict) | {key1: val1, key2: val2, key3: val3} | ・辞書のキーは変更できるものは入れられない ・キーと値のペアを管理 |
タプル(tuple) | (a, b, c, d) ※ | ・リストのように順番を維持している ・変更不可(イミュータブル) ・辞書のキーにできる |
集合(set) | {1, 2, 3, 4} | ・重複不可 ・順番は維持しない |
※カンマで区切られたものがタプルとなるため、実は丸括弧であることは重要ではない。1要素でも必ず最後にカンマが一つ必要。ただタプルを宣言するときは丸括弧が使われることが多い。
リスト(list)
プログラミング上、非常に重要なものであり、基本中の基本のコレクション型です。基礎試験には当然出題される範囲ですし、他の試験においてもここを理解せずに挑むのは困難です。
リストは繰り返し処理(for文)で使われるもので、1つずつ要素を取り出して、利用することができます。
例えば、注文リストに追加し、提供されたものは削除するというような、一時的にデータを格納し、一つずつデータを取得して処理を行うといったものです。
また、リストの要素はインデックスで操作することができます。例えば、「リスト名[0]」と書けば最初の要素を取得でき、「リスト名[-1]」と書けば1番最後の要素を取ることができます。範囲を指定したい場合はスライス操作「リスト名[1:10]」というように取り出したい範囲のインデックス番号を指定します。
このインデックス操作では、データを取ってくることだけでなく、そのインデックスに対してデータの追加・変更も可能です。
データの追加は.appendメソッドを使用します。また、リストの中にリストを入れるといった多重リストとして使用することも可能です。リスト内の要素数を確認したい場合はlen(リスト名)を使用します。
辞書(dict)
キーと値を組み合わせて管理され、キーを中心にデータの取得と入力をします。辞書を使えば、必ずキーとの組み合わせで管理されます。リストのように順番で管理されていません。あくまでもキーでデータを管理するものです。
例えば、氏名やメールアドレスといったユーザー情報を管理したい場合、このような形で登録することができます。
{“name”:”terada”, “email”:”xxx@pythonic”, “tel”:00000000000} |
値を取り出したいときは、辞書のオブジェクトに対してキーを宣言することで取得できます。
(例:名前を取り出したい→[“name”])
また、指定したキーがなかった場合にはエラーが発生しますが、それを防ぐためにgetメソッドを使用して取得するといったパターンもよく利用されます。
Pythonの辞書は、一般的にキーにint型、float型、str型を使用することはできますが、リストや辞書をキーとして設定することはできません。例えば、現在地を表す際に緯度と経度を組み合わせた数値を使用したいといった場合は後ほど説明するタプルを使用します。
タプル
カンマで区切られたものがタプルです。その他、特徴はリストとほとんど一緒ですが、イミュータブルなデータ型(変更不可能なオブジェクト)です。例えば、2要素のタプルを作ったあとに要素を追加・変更するといったことはできませんので、新たにタプルを作る必要があります。さらに特徴的なのは変更できないから辞書のキーにすることができる点です。
タプルはいつのまにか使っているケースがあります。例えば、関数のリターン(戻り値)をカンマで区切って2つの要素を返すといったようなものです。関数からの戻り値は、要素の中にリストを使われていることはあるものの、リストが使われることはほとんどなく、複数の要素が返される時にはタプルとして自動的に値が返されます。
暗黙的に使われることが多いタプルですが、使い慣れてくるとタプルの変更不可という点による必要性がだんだん理解できてくると思います。
セット(集合)
setは数学でベン図として表す集合演算(和集合、積集合、差集合)と同じことができるものです。そのため、setは要素の重複を許しません。また、内部的に順番を持っていないため、for文での処理はできるものの、順番に取り出せるとは限りません。
s1= {1, 4, 3, 2, 4, 1} s1 >>> {1, 2, 3, 4} |
なお、辞書のキーになれるものでなければ、集合の要素になることはできません。つまり、リストは集合の要素にできません。これはリストが変更可能なオブジェクトであるため、集合で同一の判定を行うことができないためです。
コレクション型を組み合わせて使うケース
辞書の中にリストが入っているケースやリストの要素の中に辞書が入っているというケースを見かけることがあると思います。
例えば順番が決まっている3名のリスト(名前、メールアドレス、電話番号)があったとします。このケースでは、リストの要素の中に辞書をいれる書き方ができます。
[{“name”:”user1”, “email”:”xxxx”, “tel”:00000000000}, {“name”:”user2”, “email”:”yyyy”, “tel”:00000000000}, {“name”:”user3”, “email”:”zzzz”, “tel”:00000000000}] |
またこういった書き方もできます。
1)辞書の値にリストを入れる
{“key1”:リスト名1, “key2”:リスト名2} |
2)辞書の中に辞書を入れる
{“key1”:{“dataA”: “abc”}, “key2”:{“dataB”: “def”}, “key3:{“dataC”: “ghi”}} |
こういった、辞書とリストを上手く組み合わせてインターフェース的に使っているのがJSONです。
JSONはJavaScriptから発生したWebのAPIのインターフェースでよく使われているオブジェクト構造で、大体辞書とリストが組み合わせて作られています。リストと辞書があれば、世の中の多くの情報を設定でき、また指定することが可能ですし、JSONへ変換したり、JSONからPythonのリストや辞書に戻したりといった事が可能です。
ここがピンとくるようになるとリストと辞書の仕組みや使い方がスムーズに頭に入ってくるのではないかと思います。具体的なイメージがつきにくいと思う方は以下の参考リンク内に具体例が載っていますので、そちらをご参照ください。
参考URL
https://gihyo.jp/article/2022/09/monthly-python-2209
https://pycamp.pycon.jp/textbook/4_collections.html
それぞれのデータ型を組み合わせられるかどうかは下図をご確認ください。
入れたいもの↓入れる先→ | リスト | 辞書 | タプル | 集合 |
リスト | 〇 | △(値のみ) | 〇(辞書のキーになれず、集合の要素にできない) | × |
辞書 | 〇 | △(値のみ) | 〇(辞書のキーになれず、集合の要素にできない) | × |
タプル | 〇 | 〇 | 〇 | 〇 |
集合 | 〇 | △(値のみ) | 〇(辞書のキーになれず、集合の要素にできない) | × |
※辞書のキーはイミュータブル(変更不可)なものだけが使用できます。
■さいごに
今回は初心者向けに、コレクション型ってどんなものかということについて少し話しました。
今回お話したコレクション型というものは、基本的にfor文の後のinの後で使えるものになっています。
どういった順番で出てくるかは、もちろんそのデータ型によって特徴がありますが、これらのコレクション型は、イテレーション可能なオブジェクト(繰り返し処理が可能なオブジェクト・イテラブル)になっているため、for文の後に使えるものになります。
また、for文との組み合わせで使うこともよくありますし、in演算子で、その中にデータが存在してるのかどうかというのにも、これらのものは全部対応しています。そういった意味での繰り返し可能なオブジェクトであるということは、基礎試験の範囲として知っておく必要があるだろうなと思います。
また、このfor文に与えられるものが、イテラブルであるかどうかということと、シーケンス的に順番に取り出せるかどうかは、またちょっと特徴が違いますが、ここも慣れの問題です。リストやタプルであれば、要素の順番で取れますけれども、現在の辞書の仕様では、入れたデータを設定した順番にキーが取り出せるということに決まってはいます。ですが、辞書の場合は、通常はそんなに順番を意識しないで使っていくもののため、厳密なシーケンスということではないと考えてもらえればいいかなと思います。
コレクション型は、基礎試験であればある一定程度の理解があればさほど苦労しないと思います。
ただし、実践試験では型ヒントやクラスの問題も含まれていますので、これらの4つのコレクション型の特徴を含め、様々な角度で理解していることを前提として出題されるため、理解していない場合は合格が非常に厳しくなるかと思います。もはやどこを理解していないかが問題ではなく、理解していて当たり前でしょうと思われていると考えてください。
このコレクション型を覚えた先には、リスト内包表記というものが待っていますが、この辺はfor文と今回紹介した4つのデータオブジェクトを理解することから始めてみましょう。特にリストを作るときには、リスト内包表記がよく使われます。これはデータ分析の世界でもよく使われると思いますので、データ分析試験またはそのデータ分析の実践試験の方に臨む方は、ぜひリストや辞書の特徴を覚えつつ、それぞれの内包表記シリーズの学習もしていただければいいかなと考えています。