Sequence,Slice
初めてPythonを触ると地味に取っつきにくい構文が現れるけども。
序数によるアクセスの他、範囲を指定してリストを得られる。
負の序数を指定すると後ろから数える。負のスライスも可
スライスの開始位置、終了位置はSequenceの前の方->後の方の順に書く。
長さがゼロ、またはマイナスの場合、空のリストを返す。
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) # []
増分値を指定することもできる。
L = [0,1,2,3,4]
c = L[0:5:2]
print(c) # [0,2]
スライス自体もオブジェクト
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要素は省略できる。
増分値に負を与えると逆順になるのを利用して要素を反転できる。
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]
スライスを指定して代入できる。
L = [0,1,2,3,4]
L[1,4] = [\'hoge\',\'fuga\']
print(L) # [0,\'hoge\',\'fuga\',4]
スライスを指定して削除できる。リストから削除するだけで要素自体を破棄しない。
L = [0,1,2,3,4]
del L[0,2]
print(L) # [3,4]
算術演算子、比較演算子、メンバーシップ演算子が用意されている。
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()で取得。
L = [0,1,2,3,4]
print(len(L)) # 5
List
リストの基本的な使い方は以下。
L1 = [0,1,2,3,4,5]
L2 = []
for E in L1:
L2.append(E)
print(L2) # [0,1,2,3,4,5]
上記は以下のように1回で書ける。リスト内包とか言うらしい。
L1 = [0,1,2,3,4,5]
L2 = [value for value in L1]
print(L2) # [0,1,2,3,4,5]
リスト内包には条件をつけられる。例えば偶数だけを集めるのは以下。
L1 = [0,1,2,3,4,5]
L2 = [value for value in L1 if value % 2 == 0] # [0,2,4]
iteratableを分解できる。
L = [(\'a\',1),(\'b\',2),(\'c\',3)]
L1 = [c*i for c,i in L]
print(L1) # [\'a\', \'bb\', \'ccc\']
iteratableの分解時に要素をリストで受けられる。
以下、タプルの第2要素以降をリストで受けて総和を求めて第1要素に掛けている。
L = [(1,2),(3,4,5),(6,7,8,9)]
L1 = [car*sum(cdr) for car,*cdr in L]
print(L1) # [2, 27, 144]
リスト内包を入れ子にすることもできる。
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オブジェクトの代表的なメソッド達。
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の負荷軽減に寄与する。
t1 = (1,2,3)
print(t1) # (1,2,3)
t2 = 3,4,5
print(t2) # (3, 4, 5)
t3 = 1,
print(t3) # (1,)