Collection…Sequence,Slice,List,Tupple

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,)