リスト Lists
どこのサイト見てもどの本読んでもサラッとしか解説が書かれてない。
誰でも分かると思うなよ、こちとら人の倍以上時間かけないと理解できないんだよ(自慢できない)。
ってわけで自分なりにまとめてみる。
変数に一つの値しかバインド(格納)出来ないのなら、リストを使えば複数の値をバインド出来る。別に数字じゃなくても、'meow'みたいな感じでクオーテーションで囲めば文字列も入れられる(囲まないと NameError : name 'meow' is not defined みたいな感じでエラーになる)。
>>> list = [1, 100, 'set', 'meow', [2, 3], 9] # リストの中に更にリストを作る事もできる。
>>> blank = [ ] # 空のリストも作れる。
こんな感じでブラケット[ ]の中にカンマで区切っていれる。
要素名は左から順に list[0] = 1, list[1] = 100, list[2] = 'set', list[3] = 'meow', list[4] = [2, 3], list[5] = 9となり、この0、1、2、3、4、5をインデックスという。
試しにインタラクティブモードで打ってみるとこうなるはず。
>>> list[3]
'meow'
負の記号を使って逆から数える事もできる。
そうするとlist[-1] = 9, list[-2] =[2, 3], list[-3] = 'meow', list[-4] = 'set', list[-5] = 100, list[-6] = 1という具合。
このインデックスを使って、格納しているデータの要素を個別に変更する事が出来る。
例えば、'meow'を5000に変えたい場合、
>>> list[3] = 5000
と打てば、'meow'が5000に上書きされる。確認するにはlistと打てば
>>> list
[1, 100, 'set', 5000, [2, 3], 9]
と出るし、または list[3] と打っても確認できる。
>>> list[3]
5000
append()を使えば要素の追加が出来る。
リスト名の後ろに .append(追加する要素)という風に使う。この時、追加される場所は最後の場所になる。
例えば、'python'と入れたい場合、
>>> list.append('python')
そしてlistと入力して確認してみると
>>> list
[1, 100, 'set', 5000, [2, 3], 9, 'python']
となるはず。
要素を削除したい場合は、インデックスを指定して消す方法と、その要素を直接指定して消す方法がある。
インデックスを指定する方法は .pop(インデックス番号)と入力する。[2, 3]を試しに消してみると、
>>> list.pop(4)
[2, 3]
となる。ここでもう一度listと入力すれば[2, 3]が消えている事が分かる。
要素を直接指定して消す場合は .remove(要素)と入力する。'set'を消すなら、
>>> list.remove('set')
これで消えるはず。
ただ、個人的にはremoveの方が使い勝手がいいんじゃないかと…というのも、もしリストの中に同じ要素が入ってた場合、popを使う場合インデックスを一々指定しなきゃなんで…まぁこれは人それぞれなのかな。やってく内にどっちの方がいいのか分かるでしょう。
次に、リストの連結。ここでリストを二つ作っておく。そしてこの二つを次のようにして連結する事ができる。
>>> list1 = [0, 1, 2, 3, 4]
>>> list2 = ['set', 'meow', 'python']
>>> list1 + list2
[0, 1, 2, 3, 4, 'set', 'meow', 'python']
また、スライスという機能を使って、リストの一部を表示する事が出来る。
>>> list1[0:3]
[0, 1, 2]
ブラケット[ ]の中に数字とコロンで位置を指定する。コロンの左側が始まり、右側が終わり。始まりは含んで終わりは含まない点に注意。例の場合、インデックス0の0は含むが、インデックス3の3は含まない為に[0, 1, 2]という風になる。
>>> list1[1:] # インデックス1から終わりまで
[1, 2, 3, 4]
>>> list1[:2] # 始めからインデックス2まで
[0, 1]
>>> list1[:] # 最初から最後まで
[0, 1, 2, 3, 4]
要素を並べ替える方法。.sort()を使うと数字の小さい方から順に、アルファベットはアルファベット順に並べ替えてくれる。
>>> list2.sort()
>>> list2
['meow', 'python', 'set']
.reverse()で今の要素の並び順を逆さまにしてくれる。
>>> list2.reverse()
>>> list2
['set', 'python', 'meow']
最後に、リストの数値に対して新たなリストを作る。list1を使ってみる。
list1の中にある数値の内、2の倍数の数字だけ二乗をしたいとする。この時、[<expression> for <element> in <sequence> if <conditional>]
>>> [i ** 2 for i in list1 if i % 2 == 0]
[0, 4, 16]
この概念を使って、冒頭にちらっと述べた空のリストを使って、新たなリストを作ってみる。
>>> blank = []
>>> for i in list1:
if i % 2 == 0:
blank += [ i ** 2 ]
>>> blank
[0, 4, 16]
おまけで、リストの中の要素数を数える方法。len(リスト名)
>>> len(blank)
3
練習問題1
>>> x = [1, 3, [5, 7], 9]
このとき、要素7を表示するにはどのようにインデックスを入力すれば良いか。
解答
x[2][1]
練習問題2
予想される表示結果は?
>>> [ x**x for x in range(5)]
解答
[0, 1, 4, 9, 16]
>>> ones = [1 for i in ["hi", "bye", "you"]]
>>> ones + [str(i) for i in [6, 3, 8, 4]]
解答
[1, 1, 1, '6', '3', '8', '4']
練習問題3
i_listの中にある各要素がthisの数字よりも小さいとき that と表示し、大きい時はそのままの数字を表示する関数 if_this_not_that(i_list, this)を書きなさい。
>>> def if_this_not_that(i_list, this):
"""
>>> original_list = [1, 2, 3, 4, 5]
>>> if_this_not_that(original_list, 3)
that
that
that
4
5
"""
解答