前章では、変数という魔法の箱にデータを入れる方法を学びましたね。でも、もし管理したいデータが100個、1000個と増えていったらどうでしょう? score1
, score2
, score3
... なんて変数を延々と作り続けるのは、考えるだけで気が遠くなりそうですよね。
そこで今回は、たくさんのデータを一つの変数でまとめてスッキリ管理するための、超便利な道具「コンテナ」について学んでいきましょう!
データが増えてくると変数は大変?
例えば、あなたが5人の生徒のテストの点数を管理したいとします。1章の知識だけだと、こんな風に書くことになるかもしれません。
student1_score = 88
student2_score = 92
student3_score = 75
student4_score = 80
student5_score = 95
5人ならまだしも、これが40人のクラスだったら...?変数を40個も作るのは現実的ではありません。それに、全員の点数の合計を計算するのも一苦労です。
こんな「たくさんの、関連性のあるデータ」を扱うために、Pythonには「コンテナ」という仕組みが用意されているのです。コンテナは、その名の通り、複数のデータを入れておける大きな容器のようなもの。早速、代表的なコンテナを見ていきましょう!
まずはコレを覚えよう!「リスト」
最もよく使われるコンテナが「リスト」です。リストは、複数のデータを「順番に」並べて格納することができます。デパートの案内板や、スマホの連絡先リストのように、データがズラッと並んでいるイメージですね。
リストの作り方と特徴
リストを作るのはとても簡単。[]
(角括弧)でデータをカンマ区切りで囲むだけです。
scores = [88, 92, 75, 80, 95]
print(scores)
これを実行すると、[88, 92, 75, 80, 95]
と、リストの中身がそのまま表示されます。さっきよりもずっとスッキリしましたね!
リストの最大の特徴は、格納したデータに「順番」があることです。そして、その順番を示す「インデックス番号」というものが、先頭から0
, 1
, 2
, 3
... と自動的に割り振られます。
注意してください! プログラミングの世界では、なぜか順番を0から数えるのがお約束なんです。これは絶対に覚えておきましょう!
このインデックス番号を使えば、特定の一つだけのデータを取り出すことができます。
scores = [88, 92, 75, 80, 95]
# 0番目(先頭)のデータを取り出す
print(scores[0])
# 3番目のデータを取り出す
print(scores[2])
実行結果は、それぞれ88
と75
になります。
さらに、リストは中身を自由に追加したり、変更したり、削除したりできます。こういう「後から変更できる」性質を、専門用語で「ミュータブル(mutable)」と言います。
scores = [88, 92, 75]
# 新しいデータを末尾に追加する
scores.append(100)
print(scores) # [88, 92, 75, 100] になる
# 1番目のデータを書き換える
scores[1] = 85
print(scores) # [88, 85, 75, 100] になる
append
はリストに用意されている「追加」の機能です。このように、リストにはデータを操作するための便利な機能がたくさん備わっています。
名前でデータを管理する「ディクショナリ」
リストは順番でデータを管理するのに便利でしたが、もし「順番」ではなく「名前」でデータを管理したい場合はどうでしょうか。例えば、「tanakaさんの点数」「suzukiさんの点数」のように。
そんな時に大活躍するのが「ディクショナリ」(辞書)です。
ディクショナリの作り方と特徴
ディクショナリは、{}
(波括弧)を使い、「キー」と「値(バリュー)」をペアにしてデータを作ります。:
の左側がキー、右側が値です。
scores = {"tanaka": 88, "suzuki": 92, "sato": 75}
print(scores)
まるで本物の辞書で単語(キー)を引くと意味(値)が書かれているように、ディクショナリではキーを指定することで、対応する値を取り出すことができます。
scores = {"tanaka": 88, "suzuki": 92, "sato": 75}
# "suzuki"さんの点数を取り出す
print(scores["suzuki"])
これを実行すると92
が表示されます。リストがインデックス番号でデータを取り出したのに対し、ディクショナリはキーでデータを取り出す、という違いが分かりましたか?
もちろん、ディクショナリもリストと同じで「ミュータブル」です。後から新しいキーと値のペアを追加したり、既存の値を変更したりできます。
scores = {"tanaka": 88, "suzuki": 92}
# 新しいデータを追加する
scores["watanabe"] = 80
print(scores) # {'tanaka': 88, 'suzuki': 92, 'watanabe': 80} になる
# "tanaka"さんの点数を変更する
scores["tanaka"] = 90
print(scores) # {'tanaka': 90, 'suzuki': 92, 'watanabe': 80} になる
リストとディクショナリ、この二つを使いこなせるようになれば、扱えるデータの幅が大きく広がりますよ!
ちょっと特殊なコンテナたち
Pythonには、他にもいくつかユニークな特徴を持つコンテナがあります。ここでは代表的な二つを紹介しますね。
タプル:絶対に中身を変えられないリスト
「タプル」は、一言で言うと「中身を変更できないリスト」です。作り方は()
(丸括弧)を使います。
fixed_numbers = (1, 2, 3)
リストと同じようにインデックス番号でデータを取り出せますが、append
で追加したり、値を書き換えようとしたりするとエラーになります。
こういう「後から変更できない」性質を「イミュータブル(immutable)」と呼びます。プログラムの中で、絶対に書き換えられたくない重要な設定値などを保存する時に使われます。
セット:重複を許さない、順番のない集まり
「セット」(集合)は、その名の通り、数学の集合と同じ性質を持つコンテナです。{}
で作りますが、ディクショナリと違ってキーはなく、値だけを入れます。
セットには二つの大きな特徴があります。
- 重複するデータを許さない: 同じデータを複数入れても、自動的に一つにまとめられます。
- 順番の概念がない: リストのようにインデックス番号でデータを取り出すことはできません。
numbers = {1, 2, 3, 2, 4, 1}
print(numbers) # {1, 2, 3, 4} と表示される(順番は保証されない)
重複した1
と2
が消えているのが分かりますね。この性質を利用して、リストから重複を取り除く、なんて使い方がよくされます。
コンテナは姿を変えられる!
面白いことに、これらのコンテナは互いに変換することができます。例えば、重複のあるリストをセットに変換して重複を取り除き、それをまたリストに戻す、というテクニックがよく使われます。
# 重複のあるリスト
original_list = ["apple", "orange", "apple", "banana"]
# 1. リストをセットに変換して重複をなくす
unique_set = set(original_list)
# この時点で unique_set は {"apple", "orange", "banana"} になっている
# 2. セットをリストに戻す
unique_list = list(unique_set)
print(unique_list) # ['orange', 'banana', 'apple'] のような結果になる(順番は変わる可能性がある)
list()
やset()
という命令で、簡単にコンテナの種類を変換できるのです。便利でしょう?
まとめ:データ整理の達人になろう!
お疲れ様でした!今回は、たくさんのデータをまとめて扱うための4つのコンテナを学びました。
- リスト: 順番が重要で、後から変更もしたいときに使う万能選手。
- ディクショナリ: 順番より「名前(キー)」でデータを管理したいときに最適。
- タプル: 中身を絶対に変えたくない、固定のデータを扱うときに。
- セット: 重複をなくしたい、または「あるデータが含まれているか」だけを高速で知りたいときに。
まずは基本となる「リスト」と「ディクショナリ」の二つをしっかりマスターしましょう!
さて、データを整理する道具は手に入れました。でも、プログラムはまだ上から下へ一直線にしか進みません。次の章では、いよいよプログラムに「もし○○だったら、△△する」といった、状況に応じた判断をさせるための「条件分岐」を学びます。プログラミングが、もっと「賢く」なりますよ!お楽しみに!
まとめができたら、アウトプットとして演習問題にチャレンジしましょう。