シーケンス型#

プログラムは「人間が嫌になってしまうような単純作業を延々と行うこと」が得意です.これまでに

  1. 文字列型(str)

  2. 整数型(int)

  3. 浮動小数点数型(float)

を紹介しましたが,例えば「1年3組のすべての学生の身長,体重データ」から,学生ごとにBMIを計算したい時,どうやればいいか分かりますか?ここまでで紹介した型では複数要素を保持することができないので,40人分の変数を用意して,それぞれ処理を書くことになります.そんなことをしていたら,自分で計算するなり,Excelで計算した方が早いですね.

ここでは面倒な単純作業をPythonに行わせるために,複数要素を保存できるデータ型を紹介します.

リスト型#

複数要素をまとめたリストを作成する型.例えば以下のように利用します.


変数 = [] # 空のリストを作る
変数 = [要素0, 要素1, 要素2, 要素3, 要素4, 要素5, 要素6] # あらかじめ要素を渡して初期化したリストを作る

ここで,それぞれの要素の型は別々でも,揃っていても構いません.

例えば先ほどの身長体重データを例に考えてみましょう.身長をheightという変数にすべて持たせてしまいたい時には,以下のように書きます.

height = [181.49154898, 174.594337  , 150.78349215, 156.45215611,
       159.16359076, 186.0955449 , 183.4154026 , 172.19241938,
       143.09579574, 166.58871137, 152.86424968, 154.69716608,
       154.14376378, 174.41741899, 154.77675632, 148.61230709,
       174.5988262 , 186.04120426, 145.58260309, 174.86335058,
       162.82585791, 168.6440591 , 162.78898705, 167.58953667,
       156.72878777, 165.10256566, 152.00426113, 159.05210476,
       154.9897736 , 145.93090124, 151.61872105, 167.76277588,
       176.64089681, 189.3265343 , 173.97411515, 166.70010256,
       171.63787008, 156.66053202, 151.22324011, 143.62535571]

weight = [62.39879115, 57.70648792, 84.85042574, 72.42281099, 90.75139248,
       68.60505313, 67.0130241 , 73.74472222, 45.88724499, 39.71282091,
       97.79812938, 77.51278572, 98.02799002, 52.32031888, 77.48833046,
       75.88226259, 32.30121063, 68.97769261, 90.30106644, 37.51962355,
       79.70900929, 31.87654392, 56.95206049, 75.31529515, 35.69415348,
       36.97097416, 54.78909566, 47.39797699, 55.1677476 , 79.70305538,
       32.80857147, 83.99631141, 69.75460334, 48.84786953, 44.03951849,
       65.42516493, 51.35428547, 65.2573042 , 92.86989301, 83.77754429]

それぞれの変数をprintしてみましょう.また,len(リスト型のオブジェクト)とすることで要素数を確認することが可能です.これも試してみましょう.

特定の要素へのアクセス#

リスト型オブジェクトは,要素のインデックスを指定することで個別にアクセスすることもできます.

height[10]
152.86424968
height[39]
143.62535571

インデックスは0からスタートします.

マイナスの数字を使うと逆から順になります.

0から39のインデックスが使えることが分かりましたが,では40以上を指定するとどうなりますか?

要素のスライス#

リストの中の複数の要素にアクセスしたい場合は,リストオブジェクト[start:end]のようにします. 例えば…

weight[0:10] # weight[:10]でも同じです.
[62.39879115,
 57.70648792,
 84.85042574,
 72.42281099,
 90.75139248,
 68.60505313,
 67.0130241,
 73.74472222,
 45.88724499,
 39.71282091]
weight[35:] # 二つ目の数字を指定しなければ最後の要素まで表示.
[65.42516493, 51.35428547, 65.2573042, 92.86989301, 83.77754429]

要素の更新#

特定の要素を更新したい場合は,今までと同様に代入式 =を利用しましょう.

print("今の状態:",weight[0])

weight[0] = 100 #kg

print("代入後の状態:", weight[0])
今の状態: 62.39879115
代入後の状態: 100

リストへの追加#

これまでprint関数を多用してきましたが,これ以外にもさまざまな関数がPythonにはあります. さらに,それぞれのデータ型(int, float, str, listなどなど)にも専用の関数が用意されています.この専用の関数のことを「メソッド」と呼びます.メソッドは以下のように利用します.

オブジェクト.メソッド(必要なら引数)

ここではリスト型のメソッド(append)を使って,リストへ要素の追加を行います.

appendメソッドの使い方は以下の通り:

weight.append(追加したい要素)
# 身長リストと体重リストに,それぞれ,150cm, 50kgの学生を追加しましょう.

要素はリストの一番最後に追加されます.

リストから要素を削除#

リストから要素を削除するにはremoveメソッドかpopメソッドを利用します.

removeメソッド#

使い方:

リストオブジェクト.remove(削除したい要素)

heightから先ほど追加した150cmの学生を削除しましょう.

popメソッド#

使い方:

リストオブジェクト.pop(削除したい要素のインデックス)

weightから先ほど追加した50kgの学生を削除しましょう.

別の型のオブジェクトをリスト型に変換する#

list()関数を使うことで,別の型のオブジェクトをリスト型に変換することができます.例えば:

a = "あいうえお"
print(a, type(a))

a = list(a)
print(a, type(a))
あいうえお <class 'str'>
['あ', 'い', 'う', 'え', 'お'] <class 'list'>

またrange(10)をリスト型に変換するとどうなりますか?

for文と一緒に使う#

forはシーケンス型を一つ一つ取り出して,仮変数に代入します.シーケンス型の要素がなくなったらループ処理が終了します.これにリスト型オブジェクトを利用すると:

for item in height:
    print(item)
181.49154898
174.594337
150.78349215
156.45215611
159.16359076
186.0955449
183.4154026
172.19241938
143.09579574
166.58871137
152.86424968
154.69716608
154.14376378
174.41741899
154.77675632
148.61230709
174.5988262
186.04120426
145.58260309
174.86335058
162.82585791
168.6440591
162.78898705
167.58953667
156.72878777
165.10256566
152.00426113
159.05210476
154.9897736
145.93090124
151.61872105
167.76277588
176.64089681
189.3265343
173.97411515
166.70010256
171.63787008
156.66053202
151.22324011
143.62535571

また,要素とそのインデックスを同時に取り出すこともできます.

for index, item in enumerate(height):
    print(index, item)
0 181.49154898
1 174.594337
2 150.78349215
3 156.45215611
4 159.16359076
5 186.0955449
6 183.4154026
7 172.19241938
8 143.09579574
9 166.58871137
10 152.86424968
11 154.69716608
12 154.14376378
13 174.41741899
14 154.77675632
15 148.61230709
16 174.5988262
17 186.04120426
18 145.58260309
19 174.86335058
20 162.82585791
21 168.6440591
22 162.78898705
23 167.58953667
24 156.72878777
25 165.10256566
26 152.00426113
27 159.05210476
28 154.9897736
29 145.93090124
30 151.61872105
31 167.76277588
32 176.64089681
33 189.3265343
34 173.97411515
35 166.70010256
36 171.63787008
37 156.66053202
38 151.22324011
39 143.62535571

さらに,複数の要素を同時に取り出すには,zip(リスト1, リスト2)を使います.これを使って次の問題を解いてみましょう.

[問題] 身長体重データを使って,BMI値と適正体重を計算して下さい.#

\[ BMI = \frac{体重[kg]}{(身長[m])^2} \]
\[ 適正体重 = (身長[m])^2 \times 22 \]

上から10人分だけ計算して,それぞれprintして下さい.

余力がある人は,全員のBMIと適正体重をそれぞれbmi変数とnormal_weight変数にリストとして保存するように,プログラムを書き換えて下さい.

辞書型#

リスト型を思い出して下さい.リストはインデックスと要素を紐付けて保存する型でした.これに対して,インデックスではなくキーとなる文字列などと要素を紐づけて保存する型が辞書型(dict)です.

最も簡単な辞書の作り方は,空の辞書を作成した後に,キー(key)と要素(value)を追加していく方法でしょう.

変数 = {}
変数[key1] = value1
変数[key2] = value2 
変数[key3] = value3 

この時に,keyは他のkeyと被らないように注意して下さい.valueについては被っても大丈夫です.またvalueにはどんな型を渡しても大丈夫です.

sample_dict = {}
sample_dict["太郎"] = "A型"
sample_dict["二郎"] = "B型"

print(sample_dict)
{'太郎': 'A型', '二郎': 'B型'}

↑のような形で要素を与えた状態での初期化も可能です.

sample_dict2 = {'太郎': 'A型', '二郎': 'B型'}

sample_dict
{'太郎': 'A型', '二郎': 'B型'}

要素アクセスはリストと同様です.

sample_dict["太郎"]
'A型'

では存在しないキーにアクセスするとどうなりますか?

[問題]テーブルデータから辞書を作成しよう.#

岩手県の人口と世帯数・市区町村別人口ランキング | 地名図鑑onlineからコピペしたテーブルを以下に示します.このテーブルからデータを取り出してリストに保存するプログラムを載せたので,これを元に,「keyには市町村名,valueには人口」を持つ辞書型オブジェクトを作成して下さい.

# https://chimei.jitenon.jp/jinko/ken.php?num=03
raw_table = """1位	盛岡市	282960人	138238戸
2位	奥州市	111632人	46340戸
3位	一関市	109697人	46385戸
4位	花巻市	92385人	38726戸
5位	北上市	92056人	40866戸
6位	紫波郡	59619人	23799戸
7位	滝沢市	55273人	24034戸
8位	宮古市	48038人	22959戸
9位	大船渡市	33540人	14765戸"""


city = []
population = []
for line in raw_table.splitlines(): # splitlinesは文字列を一行ごとに分割してリストを作るメソッド
    _, each_city, each_population, _ = line.split("\t") # splitは引数として与えられた文字列ごとに分割してリストを作るメソッド. \tはタブを表す.

    city.append(each_city)
    population.append(each_population)

# municipality:自治体