Pythonで連続したデータを扱うにはリストを使います。
本記事ではリストの基本を解説します。(ちなみにPythonのリストは他のプログラミング言語で言うところの配列に近い考え方です)
リストとは?
リストは複数のデータ(要素)を扱うのに便利な変数です。
通常の変数と違うのは添え字(インデックス)という要素を特定するための番号がついていることです。
例えばこんな感じです。
fruits[0] = “tomato”
fruits[1] = “lemon”
fruits[2] = “melon”
変数名の後の [ と ] が特徴です。ここに添え字(インデックス番号)が入ります。
添え字は、0から始まります。要素数が10であれば添え字の末尾は9となります。
空のリスト
普通の変数とは区別したい、でも要素はまだ代入したくないという時は、空のリストを定義します。
fruitsという名前の空のリストを定義するにはこうします。
fruits = []
よく、ゲームプログラムなどでは、ゲーム中に出現する敵などが monsters = [] などとプログラムの最初の方で定義されていたりします。
リストを使う
実行イメージ
tomato
lemon
apple
3
ファイル名:43_list_basic1.py
# リストを使う
fruits = ["tomato", "lemon", "apple"]
# リストを1つずつ取り出す
print(fruits[0])
print(fruits[1])
print(fruits[2])
# リストの要素数
print(len(fruits))
解説
リストの記述は2行目の部分です。
fruits = ["tomato", "lemon", "apple"]
リストは [ と ] でくくられた部分にカンマ区切りで数値や文字列を並べて記述できます。
上記、変数 fruits に設定したリストのイメージはこんな感じです。
リストは変数が連続したものと考えてみてください。変数名は上記の場合、fruits となっています。連続したデータは添え字と呼ばれる 0 から開始する番号を使って特定することができます。fruits[0] は 文字列「tomato」 と対応しています。
# リストを1つずつ取り出す
print(fruits[0])
print(fruits[1])
print(fruits[2])
リストの便利な点は、現在入力されている要素の数をlen関数を使って変数名を指定すれば取り出せる点です。
# リストの要素数
print(len(fruits))
以上は基本ですが、通常は次のスクリプトのように繰り返し処理のfor文などと一緒にリストを利用する方法が一般的です。
リストを繰り返し処理と組み合わせる
実行イメージ
tomato
lemon
apple
ファイル名:44_list_basic2.py
# リストを繰り返し処理と組み合わせる
fruits = ["tomato", "lemon", "apple"]
# リストを1つずつ取り出す
for fruit in fruits:
print(fruit)
解説
リストのデータを順番に取り出す場合、for ~ in を使うと便利です。
for ~ in を使ったリストデータの取り出し
for 《取り出す変数》 in 《リスト変数》
以下のfor文では、変数 fruit にリスト変数 fruitsのデータが最初から順に1つずつ取り出されます。
for fruit in fruits:
print(fruit)
イメージ
リストのデータを先頭から一気に処理したい場合は、この方法が便利です。
リストの例(数値リスト)
実行イメージ
[10, 20, 30, 40, 50]
合計は、150です
ファイル名:45_list_kazu.py
# リスト(数値)
kazu = [10, 20, 30, 40, 50]
# 合計を求める
gokei = 0
for n in kazu:
gokei += n
print(kazu)
print("合計は、{}です".format(gokei))
解説
数値データのリストです。
カンマ区切りでデータを並べて指定できます。
kazu = [10, 20, 30, 40, 50]
リスト変数kazuに指定した数値を全て合計する処理を for ~ in を使って実現しています。
gokei = 0
for n in kazu:
gokei += n
変数 n には 10, 20, 30, 40, 50 と順に代入されます。変数 gokei を使って累計しています。
9行目の print(kazu) ですが、リストの添え字を省いて指定するとリスト全体を表します。表示結果はリストです。
[10, 20, 30, 40, 50]
リスト(数値と文字列の混合)
Pythonのリストは柔軟です。
数値と文字列を1つのリストに代入することも可能です。
実行イメージ
2020年7月3日 金曜日
天気 晴れ
最高気温 31.5℃
ファイル名:46_list_iroiro.py
# リスト(数値と文字列の混合)
list = [2020, 7, 3, "金曜日", "晴れ", 31.5]
print("{}年{}月{}日 {}".format(list[0], list[1], list[2], list[3]))
print("天気 {}".format(list[4]))
print("最高気温 {}℃".format(list[5]))
データの形式はバラバラですが、リストの添え字はやはり 0 から始まるので、取り出し方法は数値リスト、文字列リストの場合と同じです。
リスト(for~inに直接指定する)
ここまでのスクリプトでは変数にリストを代入してから利用していましたが、一時的に利用するようなデータであれば、for ~ in に直接リストを指定してしまう方法もあります。
実行イメージ
2006年
2009年
2020年
団員1: キョン
団員2: 長門
団員3: みくる
団員4: 古泉
ファイル名:47_list_for.py
# リスト(for~inに直接指定する)
for year in [2006, 2009, 2020]:
print("{}年".format(year))
i = 1
for name in ["キョン", "長門", "みくる", "古泉"]:
print("団員{}: {}".format(i, name))
i += 1
解説
for ~ in の後にリストを直接指定しても1つずつ順に取り出されます。
数値リストの場合
for year in [2006, 2009, 2020]:
文字列リストの場合
for name in ["キョン", "長門", "みくる", "古泉"]:
通常こうした直接記述は、そのループでしか使わないデータ列などで利用します。
リストと乱数を使ってドラクエのモンスター登場
リストはどんな使い方があるのか?
ということをリストを学んだら考えていくべきだと思います。
管理人はドラクエが好きなので、リストと乱数を使って以下のスクリプトを考えてみました。
実行イメージ
ゴーレム が現れた!
リストに指定したモンスター名をランダムで表示します。
リストのデータを増やしても減らしてもそのままで動作します。
ファイル名:random_monster.py
# ランダムでモンスターが現れる
import random
monsters = ["スライム", "ゴーレム", "キメラ", "死霊の騎士", "メタルスライム"]
total = len(monsters) # 5
no = random.randrange(total) # 0~4
print("{} が現れた!".format(monsters[no]))
みなさんも色々考えてみてください。
課題
1
12星座をリストに代入し、順番に縦に表示せよ。
ファイル名:seiza.py
表示イメージ
牡羊座 牡牛座 双子座 蟹座 獅子座 乙女座 天秤座 蠍座 射手座 山羊座 水瓶座 魚座
# 12星座を縦に表示する
seiza12 = ["牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座", "蠍座", "射手座", "山羊座", "水瓶座", "魚座"]
for seiza in seiza12:
print(seiza)
2
次のリストに指定した数値の合計と平均をもとめよ。
ファイル名:list_heikin.py
suti = [ 25, 43, 54, 102, 10]
表示イメージ
合計 234
平均 46.8
# リストの合計と平均を求める
suti = [ 25, 43, 54, 102, 10]
# リストの合計を求める
gokei = 0
for n in suti:
gokei += n
# リストの要素数をもとに平均を求める
heikin = gokei / len(suti)
# 表示
print("合計は {}".format(gokei))
print("平均は {:.1f}".format(heikin)) # 小数点以下1桁表示
3
課題1 の12星座のリストデータを使って以下のように番号を入力すると対応する星座を表示するスクリプトを作成せよ。
ただし、1~12以外の数値が入力された場合は、「1~12で入力してください」とメッセージを表示させ再度入力をさせるものとする。
ファイル名:list_kadai.py
実行イメージ
12星座あります 何番目を表示しますか?(1~12): 0 ← 範囲外の数値が入力された時 1~12で入力してください 何番目を表示しますか?(1~12): 13 ← 範囲外の数値が入力された時 1~12で入力してください 何番目を表示しますか?(1~12): 9 ← 1~12の間の数値の場合 9番目は射手座です
# 無限ループによる範囲チェック
seiza12 = ["牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座",
"天秤座", "蠍座", "射手座", "山羊座", "水瓶座", "魚座"]
n = len(seiza12) # リストの要素数を求める
print("{}星座あります".format(n))
while True:
print("何番目を表示しますか?(1~12): ", end="")
no = int(input())
if no < 1 or no > 12:
print("1~12で入力してください\n")
continue
else:
break
print("{}番目は{}です".format(no, seiza12[no-1]))
上記はif文にandを用いて以下のように記述しても同じである。
# 無限ループによる範囲チェック2
seiza12 = ["牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座",
"天秤座", "蠍座", "射手座", "山羊座", "水瓶座", "魚座"]
n = len(seiza12) # リストの要素数を求める
print("{}星座あります".format(n))
while True:
print("何番目を表示しますか?(1~12): ", end="")
no = int(input())
if no >= 1 and no <= 12:
break # 正常
else:
print("1~12で入力してください\n")
continue # 範囲外
print("{}番目は{}です".format(no, seiza12[no-1]))
コメント