Pythonのリストは多次元です。
多次元リストの中でもよく使う2次元リストの使い方と利用例をこの記事では3つのサンプルプログラムとして取り上げます。
リストの基本は以下を参考にしてください。
2次元リスト:表し方と全体の表示
表計算で扱うような行と列の2次元の表はリストで簡単に表すことができます。
2次元リストの表し方
まずは2次元リストの表し方です。
元となる表のイメージです。
これを2次元リストで表すとこうなります。
covid = [
["国名", "感染者", "死者", "回復者"],
["米国", 8134334, 219355, 3604780],
["日本", 93931, 1688, 86144],
["中国", 85672, 4634, 80786],
["台湾", 535, 7, 491],
]
2次元リストで表現する場合、通常のリストで1行分を表現します。
["日本", 93931, 1688, 86144]
今回の表は1行目の見出し項目を含めると5行4列で表すことができます。
1行分が5つあるという場合、各行のリストデータを, (カンマ)で区切って全体を [ ] でくくります…と言葉で説明してもイメージしずらいですよね。
こんな感じです。
リスト名 = [
[1行目のリストデータ],
[2行目のリストデータ],
[3行目のリストデータ],
[4行目のリストデータ],
[5行目のリストデータ]
]
各行のリストデータはそれぞれが4列のリストなので、実際は以下のようにカンマ区切りでデータが入ることになります。
covid = [
["国名", "感染者", "死者", "回復者"],
["米国", 8134334, 219355, 3604780],
["日本", 93931, 1688, 86144],
["中国", 85672, 4634, 80786],
["台湾", 535, 7, 491],
]
2次元リスト全体を表示するプログラム
実際に上記の2次元リストをprint関数で表のイメージ通りに表示をしてみたのが以下のプログラムです。
通常、2次元リストは2重のループを使う事で効率よく全体を表示することが出来ます。
list_2dimension.py
# 2次元リストを使う2(2次元リストは2重のループで全体を表示する)
covid = [
["国名", "感染者", "死者", "回復者"],
["米国", 8134334, 219355, 3604780],
["日本", 93931, 1688, 86144],
["中国", 85672, 4634, 80786],
["台湾", 535, 7, 491]
] # 出典:2020-10-18 ロイター調べ https://graphics.reuters.com/CHINA-HEALTH-MAP-LJA/0100B5FZ3S1/index.html
for i in range(5):
for j in range(4):
print("{:10}".format(covid[i][j]), end="")
print() # 行ごとの改行のため
実行イメージ
国名 感染者 死者 回復者
米国 8134334 219355 3604780
日本 93931 1688 86144
中国 85672 4634 80786
台湾 535 7 491
5行目のリストデータの最後は、後にデータが続かないのでカンマをつけなくてもいいのですが、データを行ごと挿入したり削除したりしたときなど途中にカンマが無い状態だとエラーになってしまいます。全てのリストデータの最後にカンマを付けた方が、データの追加や削除の融通がきくためこうしています。
ちなみにこう記述してしまうとエラーです。(3行目のリストの最後にカンマがない)
covid = [
["国名", "感染者", "死者", "回復者"],
["米国", 8134334, 219355, 3604780],
["日本", 93931, 1688, 86144]
["中国", 85672, 4634, 80786],
["台湾", 535, 7, 491],
]
2次元リストの要素を個別に取り出す
2次元リストの個別のデータは、添え字を行列の順番で指定することで取得できます。
例えば次のような2次元リストがあったとします。
monsters = [ # データ順序(名前、攻撃力、HP)
["スライム", 5, 3],
["まどうし", 28, 30],
["キメラ", 56, 42],
["りゅうおう", 140, 130],
]
の場合、キメラの名前は3行目の1列目のデータなので、
monsters[2][0]
となります。添え字は0から始まるため、1少ないことに注意してください。
次のサンプルでは2次元リストのデータを個別に取り出しています。
list_2dimension1.py
# 2次元リストを使う1(個別に取り出す)
#
# 2次元リストの表し方
# 《リスト名》[行の添え字][列の添え字]
# 例)monsters[1][3]
# モンスターデータの2次元リスト
monsters = [ # データ順序(名前、攻撃力、HP)
["スライム", 5, 3],
["まどうし", 28, 30],
["キメラ", 56, 42],
["りゅうおう", 140, 130],
]
# 個別に2次元リストを取り出す「キメラ」の名前
print("3行1列目: {}".format(monsters[2][0]))
# 個別に2次元リストを取り出す「りゅうおう」のHP
print("4行3列目: {}".format(monsters[3][2]))
# 2次元リストの行数を取得する
gyosu = len(monsters) # len関数の値は1次元リストだと要素数になるが、2次元リストは行数となる
print("リストの行数: {}".format(gyosu))
実行イメージ
3行1列目: キメラ
4行3列目: 130
リストの行数: 4
表が頭の中にイメージできていれば2次元リストから値の取り出しは行列の添え字で取り出すだけです。(16行目、19行目)
print("3行1列目: {}".format(monsters[2][0]))
:
print("4行3列目: {}".format(monsters[3][2]))
len関数を使ったリスト要素数の取り出しについて
リストの要素数を取得できるlen関数がありましたが、2次元リストの場合はリスト全体の要素数ではなく、行数が返されることに注意してください。(22行目)
例えば、1次元のリスト
fruits = ["melon", "lemon", "tomato"]
の場合、len(fruits) とすると要素数の3が返されますが、2次元リストの
monsters = [
["スライム", 5, 3],
["まどうし", 28, 30],
["キメラ", 56, 42],
["りゅうおう", 140, 130],
]
の場合だと、len(monsters) とすると行数の4が返されることになります。
リストの要素数変更に対応したプログラム
冒頭のブログラムでは2次元リスト全体を表示する際、for i in range(5) などとして直接行数や列数を指定していました。これではリストデータを変更したときプログラム自体も変更する必要があります。
2次元のリストデータの要素数を変更してもプログラムは変更することなく動作できるようにしたプログラムが以下です。
list_2dimension2.py
# 2次元リストを使う2(リストの要素数変更に対応したプログラム)
# モンスターデータの2次元リスト
monsters = [ # データ順序(名前、攻撃力、HP)
["スライム", 5, 3],
["まどうし", 28, 30],
["キメラ", 56, 42],
["りゅうおう", 140, 130],
]
# 2次元リストの行数を取得する
gyosu = len(monsters)
# 2次元リストの全体を繰り返し処理で全て表示する
for gyobango in range(gyosu):
for data in monsters[gyobango]: # monsters[0], monsters[1]...
print("{:10}".format(data), end="")
print() # 行ごとの改行
12行目でlen関数を使って2次元リストの行数を取得しています。
gyosu = len(monsters)
これで行数変更にも対応できます。
次にこの取得した行数分ループをまわします。(15行目)
for gyobango in range(gyosu):
実際には上記のgyobangoという変数には、0, 1, 2, 3 の数値が順番に入ります。
ポイントはその内側のループです。
for data in monsters[gyobango]:
monsters[gyobango]などと行数の添え字のみ指定することで、通常の1次元配列のように扱うことができ、その行の要素を順番に変数dataに取すことができるようになります。
以上、Python:2次元リストの使い方と利用例でした。
コメント