Sequence,Slice
初めてPythonを触ると地味に取っつきにくい構文が現れるけども。
序数によるアクセスの他、範囲を指定してリストを得られる。
負の序数を指定すると後ろから数える。負のスライスも可
スライスの開始位置、終了位置はSequenceの前の方->後の方の順に書く。
長さがゼロ、またはマイナスの場合、空のリストを返す。
1 2 3 4 5 6 7 |
L = [0,1,2,3,4] a = L[1:3] print(a) # [1,2] b = L[-1:-3] print(b) # [2,3] k = K[3:1] print(k) # [] |
増分値を指定することもできる。
1 2 3 |
L = [0,1,2,3,4] c = L[0:5:2] print(c) # [0,2] |
スライス自体もオブジェクト
1 2 3 4 5 6 |
L = [0,1,2,3,4] s = slice(0,3) d = L[s] print(d) # [0,1,2] s2 = slice(0,None,1) print(L[s2]) # [0,1,2,3,4] |
スライスを構成する3要素は省略できる。
増分値に負を与えると逆順になるのを利用して要素を反転できる。
1 2 3 4 5 |
L = [0,1,2,3,4] print(L[::]) # = L[0:4:1] = [0,1,2,3,4] print(L[:]) # = L[0:4:1] = [0,1,2,3,4] print(L[::2]) # = L[0:4:2] = [0,2] print(L[::-1]) # = [4,3,2,1,0] |
スライスを指定して代入できる。
1 2 3 |
L = [0,1,2,3,4] L[1,4] = ['hoge','fuga'] print(L) # [0,'hoge','fuga',4] |
スライスを指定して削除できる。リストから削除するだけで要素自体を破棄しない。
1 2 3 |
L = [0,1,2,3,4] del L[0,2] print(L) # [3,4] |
算術演算子、比較演算子、メンバーシップ演算子が用意されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Q = [1,2] * 3 print(Q) # [1,2,1,2,1,2] R1 = [1,2] R2 = [3,4] RX = R1 < R2 print(RX) # True P = [0,1,2,3,4] PX = 7 in P print(PX) # False PXX = 15 not in P print(PXX) # True |
Sequenceの長さはlen()で取得。
1 2 |
L = [0,1,2,3,4] print(len(L)) # 5 |
List
リストの基本的な使い方は以下。
1 2 3 4 5 |
L1 = [0,1,2,3,4,5] L2 = [] for E in L1: L2.append(E) print(L2) # [0,1,2,3,4,5] |
上記は以下のように1回で書ける。リスト内包とか言うらしい。
1 2 3 |
L1 = [0,1,2,3,4,5] L2 = [value for value in L1] print(L2) # [0,1,2,3,4,5] |
リスト内包には条件をつけられる。例えば偶数だけを集めるのは以下。
1 2 |
L1 = [0,1,2,3,4,5] L2 = [value for value in L1 if value % 2 == 0] # [0,2,4] |
iteratableを分解できる。
1 2 3 |
L = [('a',1),('b',2),('c',3)] L1 = [c*i for c,i in L] print(L1) # ['a', 'bb', 'ccc'] |
iteratableの分解時に要素をリストで受けられる。
以下、タプルの第2要素以降をリストで受けて総和を求めて第1要素に掛けている。
1 2 3 |
L = [(1,2),(3,4,5),(6,7,8,9)] L1 = [car*sum(cdr) for car,*cdr in L] print(L1) # [2, 27, 144] |
リスト内包を入れ子にすることもできる。
1 2 3 4 5 6 7 8 9 10 11 |
years = [2013,2014] months = [1,2,3,4,5,6,7,8,9,10,11,12] dest1 = [] for year in years: for month in months: dest1.append((year,month)) print(dest1) dest2 = [(year,month) for year in years for month in months] print(dest2) |
Listオブジェクトの代表的なメソッド達。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
L1 = [0,1,2,3,4] L1.append(5) print(L1) # [0,1,2,3,4,5] L2 = L1.copy() print(id(L1)) # 140415098962824 print(id(L2)) # 140415098984840 L2.clear() print(L2) # [] print(L1.count(2)) # 1 L3 = ['a','b','c'] L1.extend(L3) print(L1) # [0, 1, 2, 3, 4, 5, 'a', 'b', 'c'] L4 = L1.index(0) print(L4) # 0 L1.insert(4,'hoge') print(L1) # [0, 1, 2, 3, 'hoge', 4, 5, 'a', 'b', 'c'] p = L1.pop(3) print(p) # 3 print(L1) # [0, 1, 2, 'hoge', 4, 5, 'a', 'b', 'c'] L1.remove(4) print(L1) # [0, 1, 2, 'hoge', 5, 'a', 'b', 'c'] L1.reverse() print(L1) # ['c', 'b', 'a', 5, 'hoge', 2, 1, 0] |
Tuple
更新不能なリスト。要素を列挙するだけでTupleを作れる。更新できない以外はListと変わらない感じ。
“更新できない”という特徴があるため、辞書のキーとして使うことができる。
リストは要素としてそれぞれ独立した値が設定されることを想定。
タプルは全体で1つの要素になることを想定。タプルは「複数の要素から構成される値」。
“更新できない”という特徴は、メモリ割り当て時に動的確保を想定しなくて良いため、
リストよりもタプルの方がメモリ使用量を削減できるし、GCの負荷軽減に寄与する。
1 2 3 4 5 6 |
t1 = (1,2,3) print(t1) # (1,2,3) t2 = 3,4,5 print(t2) # (3, 4, 5) t3 = 1, print(t3) # (1,) |