2. リスト変数と辞書変数

第1回の講義で、1つの変数を定義して演算子を使って変数の内容を変更することを 行いました。関連のある変数や連続するデータを取り扱う場合、変数を一つの 塊として定義(リスト変数)したり、キーワードと結びつけて管理(辞書変数)し た方が効率的です。第2回は、データを塊として扱うためのリスト変数と辞書 変数の使い方を学びます。第2回講義の目的は以下のとおりです。

  • リスト変数と辞書変数の定義の方法を覚える

  • リスト変数の要素の参照法(要素番号やスライス)を使えるようになる。

  • 演算子を使ってリスト変数を演算する方法を理解する。

  • 辞書変数のキーと要素を使えるようになる。

リスト変数

変数を連続して定義したり利用する場合は、1つの変数だけでなく リスト として変数を定義します。リスト変数が保持している変数を 要素 と呼び ます。n個の要素をもつ リスト は、データ(ベクトルの成分)が並んだn次元のベクト ルのようなものをイメージすると良いでしょう。

リスト変数の定義

リスト変数の定義は、 , で要素を区切って並べて[ ]で囲み定義します。

list_variable = [variable0, variable1, variable2...]

要素番号は 0 から始まる整数になります。たとえば、5人分の体重を要素 としてもつリストを定義してみます。

example-01
1length = [74.5, 80.3, 120.2, 180.2, 220.3]  # 5つ要素をもつリスト変数lengthを定義

この例では要素番号は0, 1, 2, 3, 4の5個です。5個の要素を定義した場合、最大の要素番号は4になります。

リスト変数の個別要素へのアクセス

リストの中の個別の要素は[ 要素番号(index) ]でアクセスできます。 要素番号は0からはじまるint型です。リストの要素は、整数の要素番号を使って参照します。-1のような負値の要素番号は、リストのお尻から要素を参照すること になります。以下に例をあげています。

example-02
 1length = [74.5, 80.3, 120.2, 180.2, 220.3]  # 5つ要素をもつリストを定義
 2print(length)      # lengthのすべての要素を表示
 3print(length[0])   # 74.5
 4print(length[1])   # 80.3
 5print(length[2])   # 120.2
 6print(length[3])   # 180.2
 7print(length[4])   # 220.3
 8print(length[-1])  # length[4]と同じ 220.3
 9print(length[-3])  # length[2]と同じ 120.2
10print(length[5])   # これは定義されていないのでエラー

lengthに以下のような並びでデータが保存されていることをイメージしてくだ さい。indexは0から始まることに注意です。5つの要素をもつリスト変数の場 合、indexは0, 1, 2, 3, 4なので、最大のindexは4になります。indexが5のデータは定義されていないのでエラーになります。

../_images/list.png

1つのリストが保持する要素は、同じ型である必要はありません。たとえば、 以下の例では、int型とfloat型とstr型の要素をもったリストを定義していま す。

example-03
1a = [2, -1.0, "ohkubo"]  # 3つのリストを定義

リスト変数のスライス処理

リスト変数から指定した要素をスライスして、新しいリストを作成することが できます。リスト変数のスライス操作は : を用いてスライスの始点と終 点を指定します。以下の例でスライス操作を理解しましょう。

example-04
1a = [2.0, -1, "hoge", 3, "a"]  # 5つのリストを定義
2b = a[0:3]                     # bは、index 0, 1, 2をスライスしたリストになる。b = [2.0, -1, "hoge"]
3b = a[ :3]                     # a[0:3]と同じスライス
4b = a[3:5]                     # bは、index 3, 4をスライスしたリストになる。b = [3, "a"]
5b = a[3: ]                     # a[3:5]と同じスライス
6b = a[-4: ]                    # a[1:]と同じスライス

要素の範囲を 1:4 と指定した場合、a[1], a[2], a[3]で構成するリストが生 成されます。a[4]は含まれないことに注意してください。スライスの始点と終 点を指定しない場合、0と最大の要素番号+1がセットされます。

リスト変数の変更

定義されたリストに対して、個別の要素の値を変更することができます。当然ですが、各要素で許されない演算(文字型*浮動小数等)があればエラーになります。

example-05
1a = [2.0, -1, "hoge", 3, "a"]  # 5つのリストを定義
2a[0] = 3 * 2                   # a[0]の要素は6
3a[2] = a[2] * 2                # a[2]の要素は"hogehoge"

定義されていないリストの要素にアクセスするとエラーになります。

example-06
1a = [2.0, -1, "hoge", 3, "a"]  # 5つのリストを定義
2a[5] = "b"                     # [5]は定義されていなのでエラー
3a[-6] = "b"                    # これもエラー

リスト変数の演算

リスト変数に許される演算は、 リスト演算同士+ と整数との * のみです。

演算子

演算例

演算結果

+

[3, 2, 5] + ["hoge", "huga", 3]

[3, 2, 5, "hoge", "huga", 3]

*

3 * ["hoge", "huga"]

["hoge", "huga", "hoge", "huga", "hoge", "huga"]

example-07はリスト変数とリスト変数の足し算の例です。リスト変数とリスト変数を + で演算することで、リスト変数にが結合したリストが生成されます。この演算によってリストに要素を追加することができます。

example-07
1a = [0, 2, 3, 4]          # リストaの定義
2b = ["hoge", 3.0, 89, 3]  # リストbの定義
3c = a + b                 # aとbが結合した c = [0, 2, 3, 4,"hoge", 3.0, 89, 3]が生成
4print(c)
5
6# 定義されたリストに1つの要素を追加したい場合
7c = a + [3]               # 要素3をaに追加 c =[0, 2, 3, 4, 3]
8a += [3]                  # 単項演算子でaに要素3を追加(わかりにくいのでおすすめしない)
9print(a, c)               # [0, 2, 3, 4, 3] [0, 2, 3, 4, 3]の出力

example-08はリスト変数とint型との掛け算の例です。整数nをリストに掛けた場合、1つのリストがn回繰り替えした要素をもつリストが生成されます。

example-08
1a = [0, 2, 3, 4]   # リストの定義
2a = 2 * a          # aは[0, 2, 3, 4, 0, 2, 3, 4, ]
3b = [0]            # 1つの要素をもつリストの定義
4b *= 5             # 単項演算子をつかってa=[0, 0, 0, 0, 0]にupdate
5print(a, b)        # [0, 2, 3, 4, 0, 2, 3, 4] [0, 0, 0, 0, 0]の出力

文字型とリスト

str型変数を定義した場合、1文字1文字が要素となるリスト変数として定義されます。以下の例をみてください。

example-09
1chiba = "chiba uni."         # str型のchibaを定義。スペースも1文字なことに注意
2print(chiba[0])              # chibaのindex0は"c"
3print(chiba[1])              # chibaのindex1は"h"
4print(chiba[2])              # chibaのindex2は"i"
5print(chiba[3])              # chibaのindex3は"b"
6print(chiba[3:6])            # chibaのindex3は"ba "

リストとして文字のデータは次のように配列さています。

../_images/list_str.png

str型変数の演算は、str方同士の足し算( + )とint型と掛け算( * )だけ許されます。 str型はリストでもあるので、リスト変数に許される演算と同じルールです。

example-10
1chiba = "chiba uni."                         # str型のchibaを定義。スペースも1文字なことに注意
2s = chiba + " faculty of eng."               # " faculty of eng."を追加し"chiba uni. faculty of eng."を生成
3t = chiba[:6] + "uniersity"                  # "chiba "に"university"を追加し"chiba university""を生成
4print(s)                                     # sの出力
5print(t)                                     # tの出力
6u = 3 * chiba[0:3] + "-ba" + chiba[-5:]      # "chichichi-ba uni."を生成
7print(u)

多次元リスト

リストの中の要素をリストとすることで、多次元リストを定義することができま す。以下のは、3×3の2次元配列を定義した例です。3行3列の行列を思い浮か べてください。

example-11
1two_dim = [[3, 4, 5], [9, 19, 12], [0, 3, 4]]
2print(two_dim[0][0])    # 1行1列の要素9にアクセス
3print(two_dim[1][2])    # 2行3列の要素12にアクセス
4print(two_dim[2][2])    # 3行3列の要素4にアクセス

以下のようなデータの並びをイメージしてください。

../_images/list_mat.png

文字列を要素としたむリストを定義した場合、indexで要素を取り出してから、特定の文字にアクセスできます。

example-12
1chiba = ["ohkubo", "chem", "kyosei", "工学部"]      # 文字列の定義
2print(chiba[0])                                     # ohkubo
3print(chiba[1][2])                                  # e
4print(chiba[1][0:2])                                # ch
5print(chiba[-1][-2])                                # 学

以下のようなデータの並びになります。

../_images/list_str2d.png

多次元リストで、各要素のリストは同じ要素数である必要がありません。また複数行にわたって定義することも許されます。

example-13
1l = [["1", "2", "3"],
2     ["原子番号"],
3     ["主量子数", "方位量子数", "磁気量子数", "スピン量子数"],
4     ["シュレディンガー", "方程式"]]
5s = l[1][0] + l[0][1] + "の" + l[2][0] + "は" + l[0][0]
6print(s)  #  "原子番号2の主量子数は1"の出力

整数とリストの足し算は許されないので以下の例はエラーになることに注意です。

example-14
1l = [["1", "2", "3"],
2     ["原子番号"],
3     ["主量子数", "方位量子数", "磁気量子数", "スピン量子数"],
4     ["シュレディンガー", "方程式"]]
5l[0] = [1, 2, 3]   # l[0]の要素を[1, 2, 3]に変更
6s = l[1][0] + l[0][1] + "の" + l[2][0] + "は" + l[0][0]  #  l[0][1]とl[0][0]は整数なのでエラー

注釈

pythonの基本機能で提供されているリストの操作や演算は、科学技術計算で頻出する行列計算を効率的(高速)に行うことができません。科学技術計算で多用する多次元配列の操作や演算は、後述するnumpyを使って行います。

辞書変数

リスト変数は0から始めるindexで要素に結びつけられていました。 indexの代わりにkeyで要素を管理するのが辞書型です。リストと似てますが、 keyで要素が結びつけているのが辞書型の特徴です。リストで1つのindex番号 が複数の要素を持たないように辞書型も1つのkeyは1つの要素を持ちます。

辞書の定義

辞書変数の定義は以下のように行います。keyの型はint, floatまたは文字型 の何でも良いです。要素としてリストを持つことも可能です。

dic = {key1: value1, key2, value2, ...}

具体的な、辞書変数を定義する例は以下のとおりです。

example-15
dic = {"hoge": 0, 3: 4}  # "hoge"が要素0のkey, 3が要素4のkey

dicの値にアクセスしたり値を変更したりしてみます。

example-16
dic = {"hoge": 0, 3: 4}      # key="hoge"が0のkey, 3が4のkey
print(dic["hoge"])           # "key=hoge"の要素0を表示
dic[3] = "hoge"              # key=3の要素を"hoge"に変更
print(dic[3])                # key=3の要素"hoge"を表示

リスト変数は、異なる点は新しいkeyを指定することで要素を追加できることです。

example-17
1dic = {"hoge": 0, 3: 4}      # "hoge"が0のkey, 3が4のkey
2dic["huga"] = 32             # key="huga"の要素32が追加された。
3dic["千葉大"] = "稲毛区"     # key="千葉大"の要素"稲毛区"が追加された。
4print(dic)                   # 辞書変数の表示

辞書変数は要素としてリストをもつこともできます。

example-18
1dic = {"大学": ["千葉", "茨城", "東京", "Oxford"],
2       "小学校": ["緑", "千葉大付属", "登戸"]}       # 辞書の定義
3print(dic["大学"][0])                                # "千葉"
4print(dic["小学校"][1:3])                            # ["千葉大付属", "登戸"]

注釈

リスト変数と異なり、スライス操作による要素の削除や演算による要素の追加は、許されていません。

クイズ

Q1

以下のリストを変更し、 ["chiba", 3, 4, 8]のリストにし表示する。

hoge = [0, 1, 2, "chiba"]

答え

1hoge = [0, 1, 2, "chiba"]
2hoge[0] = "chiba"
3hoge[1] = 3
4hoge[2] = 4
5hoge[3] = 8
6print(hoge)

Q2

以下のリスト変数を操作して要素10を取り出す。また、スライス操作を行って["chiba", 5, 7, 9]を要素にもつ新しいリスト変数hugaを作り表示する。

hoge = [0, 1, 2, "chiba", 5, 7, 9, 10, 12]

答え

1hoge = [0, 1, 2, "chiba", 5, 7, 9, 10, 12]
2l = hoge[3:7]
3print(l)

Q3

以下のリストaとbを演算して[1, 2, 3, 1, 2, 3, 4, 5, 6]を要素にもつリストcを作り表示する。

1a = [1, 2, 3]
2b = [4, 5, 6]

答え

1a = [1, 2, 3]
2b = [4, 5, 6]
3l = a + a + b
4print(l)

Q4

以下の文字変数から文字列"共生"を取り出して表示する。

s = "私は千葉大学工学部共生応用化学科です。"

答え

s = "私は千葉大学工学部共生応用化学科です。" print(s[9:11])

Q5

以下の文字変数を操作して文字列 "私は千葉大生。" を取り出して表示する。

s = "私は千葉大学工学部共生応用化学科です。"

答え

1s = "私は千葉大学工学部共生応用化学科です。"
2l = s[2:5] + s[-9] + s[-3:]
3print(l)

Q6

以下のリスト変数から文字列 "県の人口は6,268,585人" を取り出して表示する。

chiba = ["千葉県は、日本の関東地方南東側に位置する",
        "広域地方公共団体のひとつ",
        "県庁所在地及び最大の都市は千葉市",
        "県の人口は6,268,585人",
        "面積は5,157.61平方キロメートルである"]

答え

1s = "私は千葉大学工学部共生応用化学科です。"
2l = s[2:5] + s[-9] + s[-3:]
3print(l)

Q7

以下の2次元リストから文字"uni"を取り出して表示する。

1s = [["hoge", 3, 4],
2     ["chiba university", "千葉"]]

答え

1s = [["hoge", 3, 4],
2    ["chiba university", "千葉"]]
3print(s[1][0][6:9])

Q8

文字列 A = "hogehoge" を演算(1文で)して文字列"hoghoghog"を作って表示する。

1A = "hogehoge"

答え

A = "hogehoge"
print(3 * A[0:3])

Q9

スライス操作を行ってリストAとBそれぞれから[3, 4]を抜き出して表示する。

1A = [9, 3, 20, 3, 4]
2B = [[2, 3, 4], ["hoge", 3, 8], [0, 1]]

答え

A = [9, 3, 20, 3, 4]
B = [[2, 3, 4], ["hoge", 3, 8], [0, 1]]
print("A", A[-2:])
print("B", B[0][1:])

Q10

空のリストを3つもつ2次元リストと1次元リストa, b, cを次のように定義する。

list_2d = [[], [], []]
a = [3, 4, 5]
b = [1, 2]
c = [8, 9, 10]

定義した空リストへ演算操作をして次のリストを作成し表示する。

[[3, 4, 5], [1, 2], [8, 9, 10]]

答え

list_2d = [[], [], []]
a = [3, 4, 5]
b = [1, 2]
c = [8, 9, 10]

list_2d[0] = a
list_2d[1] = b
list_2d[2] = c

print(list_2d)

Q11

以下の辞書型変数から100を取り出して表示する。

dic = {80: 3, 4: "hoge", "千葉大": 100, 3: "千葉大"}

答え

1dic = {80: 3, 4: "hoge", "千葉大": 100, 3: "千葉大"}
2s = dic["千葉大"]
3print(s)

Q12

以下の辞書型変数からkeyが"千葉大"の要素を表示する。さらに、keyが" 共生"で要素が2のデータを辞書変数dicに追加する。

dic = {80: 3, 4: "hoge", "千葉大": 100, 3: "千葉大"}

答え

1dic = {80: 3, 4: "hoge", "千葉大": 100, 3: "千葉大"}
2s = dic["千葉大"]
3dic["共生"] = 2
4print(dic)

Q13

空の辞書変数(element = {})を定義し、以下のkeyと要素からなる辞書変数デー タを作成する。作成したelementにアクセスしてGaの原子量を表示させる。

key

要素

B

10.811

Al

26.981539

Ga

69.723

In

114.818

Tl

204.3833

答え

element = {}
element["B"] = 10.811
element["Al"] = 26.981539
element["Ga"] = 69.723
element["In"] = 114.818
element["Tl"] = 204.3833

print("{}の原子量は{:.3f}です".format("Al", element["Al"]))

Q14

次のように辞書変数dic[a]とdic[b]を定義する。

a, b = 1, 2
dic = {}
dic[a] = [[4, 5], ["a", "b", "c"], [10, 11]]
dic[b] = [['x', 'y', 'z'], [3, 4, 5]]

定義した辞書変数の参照し、リストのスライス処理と演算で次の内容を表示する。

[3, 4, 5, 'x', 'y', 'z']