こんにちは、森山です。
前回のコラムでは「while文」を使って、SSRが出るまで終わらない「無限ガチャ」のようなプログラムを作りました。条件が満たされるまで繰り返すという動きは、プログラミングには欠かせない要素です。
これまで「変数」や「条件分岐」、「繰り返し処理」などを学んできましたが、ここでこれまでに登場した「データの中身の種類」について復習してみましょう。
今まで学んできたデータ型には、文章を扱うstr型(文字列)、整数のint型、小数点を扱うfloat型、そしてTrue(真)か False(偽)かで判断するbool型(真偽値)がありました。
これらの型はどれも、「1つの値」を表すデータ型です。文字列なら1つの文章、整数なら1つの数字。例えば、score = 80 としたとき、scoreに入っているのは「80」という1つの整数だけです。そして、score = 80 の後に score = 100 というコードを書くと、古いデータ(80)は上書きされて、scoreという変数の中身は「100」になります。
でも、「色々な教科の点数を入れたい」「ゲームに登場するジョブをまとめておきたい」となったとき、1つしか変数に入れられないと困りますよね。
そこで登場するのが、ハイスクールPythonの5章にも登場している「リスト型」です。実は、第1時限目の「占いプログラム」にもこっそり登場していました。
リスト型って何?
「リスト型」を一言で言うなら、「複数のデータを、番号付きのポケットに順番に入れておける箱」や「名簿ノート」というイメージです。
- これまでの型(str・int・float・bool): 1つの値だけを表す。score = 80 なら「80」という1つの数字。
- リスト型: 複数の値を番号付きのポケットに順番に入れて管理できる。点数なら [80, 90, 75, 100] のようにまとめて管理できます。
Pythonでは、複数のデータをまとめたものを「リスト」と呼びます。PHPなど他の言語では「配列」と呼ばれますが、役割は同じです。このリスト型では「3番目のデータだけ取り出す」「2番目から5番目までまとめて取り出す」といった操作ができるようになります。これを使えば、テストの点数やクラス全員の名前、ゲームのジョブ一覧などを1つの変数名で扱えるようになります。
実は、第6時限目で使った range(10) は、イメージとしては
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] のようなデータの並びでした。
リストそのものではありませんが、このように順番に取り出せる形になっているため、for文で繰り返し処理ができたのです。
リストの書き方のルール
リストを作る時は、以下のルールで書きます。
- 全体を [ ](角カッコ) で囲む。
- 中に入れるデータ(要素)を ,(カンマ) で区切る。
第1時限目の占いプログラムを思い出してみましょう。 プログラムの中にこのコードがありましたね。
fortune = random.choice(["大吉", "中吉", "吉", "小吉"])この [“大吉”, “中吉”, “吉”, “小吉”] の部分がリストです。「fortune」という1つの変数名の中に、4つのstr型の値が入っているという状態です。
占いプログラムではリストの中は全てstr型になっていましたが、このリストはすべて同じ型でそろえる必要はありません。
profile = ["杉田太郎", 17, 165.5, True]これは「名前(str型)」「年齢(int型)」「身長(float型)」「部活の所属(bool型)」を1つのリストにまとめた例です。違う型が混在していてもエラーにはなりません。
1人ずつのデータは作れましたが、この書き方では人数が増えるほど変数の数も増えてしまいますね。そんな時はリストの中に複数のリストを入れる書き方にすると、1つの変数に複数人のデータを入れる事ができます。
下記のようなコードになります。
students = [
["杉田太郎", 17, 165.5, True],
["井上花子", 16, 158.2, False],
["江口健太", 18, 172.0, True]
]これを「二次元リスト」と呼びます。この二次元リストというデータの形は、複数人分の情報をまとめて扱うのにとても便利で、AIの学習データとしても活用されています。実際の機械学習では、このような形で何万・何百万人分ものデータを用意してAIに学習させることもあります。機械学習に興味がある人は、ぜひこのデータの扱い方を覚えておいてください。
リストは空でも作れる
items = []「まだ何も入っていないけど、後で追加していく予定の箱」として、空のリストを先に作っておくこともプログラムではよくあります。
データの取り出し方と「0」のルール
リストから特定のデータを取り出すには、「左から何番目か」という番号(インデックス)を使います。ここで、以前学んだプログラム特有のルールを思い出してください。
そう、「数は 0 から数え始める」 というルールです。
例えば、cards = [“勇者”, “魔法使い”, “戦士”] というリストの場合:
- 「勇者」←0番目
- 「魔法使い」←1番目
- 「戦士」←2番目
このようにリストの最初は0番目から数えます。これはPythonの大切なお作法なので覚えましょう。
リストと「繰り返し処理」は相性バツグン!
リストの本当の力は、第6時限目で学んだ 「for文(繰り返し)」 と組み合わせた時に発揮されます。
例えば、リストの中に100個のデータが入っていても、for文を使えば「リストの端から端まで順番に中身を取り出して処理して!」と、シンプルなコードで命令できます。
- 全員分のテスト結果リストから平均点を出す。
- 大量のデータから特定の名前だけを見つけ出しピックアップする。
これらはすべて、リストと繰り返し処理をセットで使うことで実現できます。
実際にプログラムを動かしてみよう
今回はリストを使ってアイテムが引ける10連ガチャを作ってみましょう。今回もrandomモジュールを使って、ガチャらしくランダムにアイテムが出るようにしてみましょう。
import random
# ガチャの排出リスト(レアリティ付き)
gacha = [
["伝説の剣", "★★★★★"],
["炎の魔法書", "★★★★"],
["鉄の盾", "★★★"],
["木の棒", "★"],
["石ころ", "★"],
]
print("=== ガチャを10回引きます ===")
for i in range(10):
result = random.choice(gacha)
print(f"{i+1}回目:{result[1]} {result[0]} が出た!")このコードをGoogle Colabで実行してみてください。実行するたびに色々なアイテムが引けると思います。random.choice は、リストの中からランダムに1つ取り出す命令でしたね。
ここがポイント!
- リストの中にリストを入れた「二次元リスト」を使うと、アイテムとレアリティをまとめて入れる事ができます。
- random.choice でリストからランダムに1つ取り出して変数に入れます。
- result[0] でアイテム名、result[1] でレアリティをそれぞれ取り出しています。
リストの中身を自分の好きなアイテムやレアリティに変えたり、排出数を増やしたりして、結果がどう変わるか試してみても楽しいと思います。
※このプログラムではレアリティに関係なく、すべてのアイテムが同じ確率(20%ずつ)で出るようになっています。
実はPythonには random.choices(choiceに s がついたもの)という似た機能もあり、その中の weights という設定を使うことで「レアリティが高いものほど出にくくする」といった確率の調整もできます。
興味がある人は、weights の使い方を調べて、ぜひ本格的なガチャのプログラムに変えてみてください。
リスト型を使えばバラバラなデータをまとめて扱えるようになる
リスト型が使えると、プログラムで「複数のデータをまとめて動かす」ということができるようになります。
今回学んだことを整理してみましょう。
- リスト型: 1つの変数に、複数のデータをまとめて持てる「番号付きのポケットがある箱」。
- [ ] で囲み、, で区切って書く。
- 中身を数えるときは 0番目 から!
- for文 と組み合わせると、複数のデータを一度に処理できる。
これで、第1時限目の占いプログラムの謎はすべて解けましたね。
今まで学んだ変数の型、条件分岐、繰り返し、モジュール、そしてリスト。これらを組み合わせれば、アイデア次第でどんどん面白いプログラムが作れるようになります。
リストを使いこなしていくと、「データを追加したい」「特定のデータだけ取り出したい」「並び替えたい」という場面が出てくると思います。ハイスクールPythonの5章ではそんな時に便利な append や sort などの書き方も詳しく紹介されていますので、ぜひ色々な処理にも挑戦してみてください。
最後までお読みいただき、ありがとうございました。
それではまた次回お会いしましょう!
