空飛ぶチンアナゴの統計解析日記

統計解析を嗜むチンアナゴのメモ帳です

本当に初心者が学んでほしいコードの話 〜その2 変数の型2〜

データをひとまとめで欲しいことがある。
例えば友達の名前、郵便番号の一覧といった単純なデータの羅列から、誰々の名前、性別、生年月日、郵便番号、住所といった一塊のデータ一式のようなものを格納するのにいちいち

name0 = 'Tom'
name1 = 'Adam'
name2 = 'Adrian'
……

とか

name0 = 'Tom'
gender0 = 'male'
birthday0 = '19990627'
……

なんてやるのはとてもとても効率が悪い。
これを一塊のデータとして扱う方法はないか?
ある。Pythonであればリスト、辞書、タプル、集合といったデータを一塊にした変数の型が存在する。
初心者はぶっちゃけリストと辞書だけ覚えておけばまず死なないので、今回はリストと辞書について説明する。

リスト

データを一塊にしたもので一番単純な形がこの「リスト」と呼ばれる形式だ。
「リスト」は

リストの名前 = [中身1, 中身2, 中身3,……]

という形で表現される。
例えば最初の名前の変数群をリスト形式にすると

name = ['Tom', 'Adam', 'Adrian', 'Alan']

というように表現される。
リストnameの頭から3番目のデータを取り出したいときは

name = ['Tom', 'Adam', 'Adrian', 'Alan']
print(name[2])

とすると'Adrian'が画面に表示される。
nameの[]内の数字はリストの中の何番目のデータを表しているが、3番目であるから3であるはずが2となっている。これはPythonでは頭から数えるとき最初の数が0から数えるためである。これは言語によってリストの頭の数が何から始まるのか異なるのでよく確認しておかなければならない。 STATAの場合は1からなので割と混乱する。
リストはデータを追加したり、中身の順番をソートしたりすることができる。

name = ['Tom', 'Adam', 'Adrian', 'Alan']

# Brianをnameの最後尾に追加するよ
name.append('Brian')

# AdamをArisonに変えるよ
name[1] = 'Arison'

# Tomをリストから削除するよ
name.remove('Tom')

# nameをソートするよ
name.sort()

詳しくは公式ドキュメントのリスト型(https://docs.python.org/ja/3/tutorial/datastructures.html#more-on-lists)に目を通してみると良いだろう。

辞書

さて、

name:Tom
gender:male
birthday:1999年06月27日

のトム君がいると仮定しよう。
これを

friend1 = ['Tom', 'male', 19990627]

というリストとして格納した場合何が起きるか?
例えばうっかりリストをソートしてしまい順番が入れ替わってしまった場合、とても困ることになる。
また、これに郵便番号、住所や電話番号等データを付け加えたりしてデータが大きくなるとこのデータが何を意味しているのかがとても分かりにくい。
こういうときデータに名前が付いていると分かりやすい。それが辞書データの大きな特徴だ。
辞書データは

辞書の名前 = {key1: item1, key2: item2, ……}

という形で表記される。辞書と違って{}でデータを囲む必要がある。また必ず、keyとitemがセットで必要になる。
先ほどのfriend1を辞書で表すとこうなる。

friend_dic = {'name': 'Tom', 'gender': 'male', 'birthday': '19990627'}

例えばこの辞書に登録されているnameのデータを知りたいときは

friend_dic['name']

という知りたいデータのキーをリストで言う所の場所の代わりに入れてあげると呼び出すことができる。
リストと同様にデータを追加したり、削除したり、データを変更したりすることはできる。

friend_dic = {'name': 'Tom', 'gender': 'male', 'birthday': '19990627'}

# friend_dicに郵便番号を追加する
friend_dic['zipcode'] = 1111111

# friend_dicのzipcodeを1213333変更する
friend_dic['zipcode'] = 1213333

# friend_dicのzipcodeを削除する
del friend_dic['zipcode']

ただし、順番はないのでソートはない。
詳細は公式ドキュメントの辞書(https://docs.python.org/ja/3/tutorial/datastructures.html#dictionaries)を見ていただけるといいが最初はこのくらいわかっていれば一応事足りると思う。

タプルや集合

なんかそんなものあるなーでOKです。
特に理解していなくても最初は問題ありません。

まとめ

リスト、辞書はデータを塊として扱う際にとてもよく使います。
ぜひ使いこなせるようにしてください。