Python入門で気をつけるポイント(2)リスト

Python入門で気をつけるポイント(2)リスト

リストで使えるメソッド

メソッド 使い方
append(x) リストの末尾に要素を一つ追加します。
extend(iterable) イテラブルのすべての要素を対象のリストに追加し、リストを拡張します。
insert(i, x) 指定した位置に要素を挿入します。第 1 引数は、リストのインデクスで、そのインデクスを持つ要素の直前に挿入が行われます。従って、「a.insert(0, x)」 はリストの先頭に挿入を行います。
remove(x) リスト中で x と等しい値を持つ最初の要素を削除します。
pop([i]) リスト中の指定された位置にある要素をリストから削除して、その要素を返します。インデクスが指定されなければ、「a.pop()」 はリストの末尾の要素を削除して返します。この場合も要素は削除されます。
clear() リスト中の全ての要素を削除します。
index(x[, start[, end]]) リスト中で x と等しい値を持つ最初の要素の位置をゼロから始まる添字で返します。 該当する要素がなければ ValueError が送出されます。任意の引数である start と endはスライス記法として解釈され、リストの探索範囲を指定できます。返される添字は、start 引数からの相対位置ではなく、リスト全体の先頭からの位置になります。
count(x) リストでの x の出現回数を返します。
sort(key=None, reverse=False) リストの項目を、インプレース演算 (in place、元のデータを演算結果で置き換えるやりかた) でソートします。引数はソート方法のカスタマイズに使えます
reverse() リストの要素を、インプレース演算で逆順にします。
copy() リストの浅い (shallow) コピーを返します。

リストで気をつけること

リストでスタックとキューを使う

スタックとキューとは?
スタック・・・縦に積み重ねたイメージ、後入先出
キュー・・・横に並べたイメージ、先入先出

スタック

Pythonでリストをスタックとして使うには次のメソッドを使います。
append():アイテムを最後に追加
pop():最後のアイテムを取得するにはインデックスを指定しないpop()を使う

キュー

キューの操作はinsert()やpop()を使ってもできますが、低速になります。
collections.dequeを使う方がベター
deque(デックと発音する)は,両端キューのことで,スタックとキューの機能を持っています。シーケンスのどちらの端でも要素を追加,削除できるようにしたいというときに便利です。
appendleft()とpopleft()がキューで、append()とpop()がスタックです。

>>> from collections import deque
>>> queue = deque(['Eric','Jone','Michel'])
>>> queue.append('Terry')
>>> queue.append('Graham')
>>> queue.popleft()
'Eric'
>>> queue.popleft()
'Jone'
>>> queue
deque(['Michel', 'Terry', 'Graham'])

応用
機械学習でdequeを使ったデータ供給の小技

リストの内包表記

for in文でリストを加工して再度リスト化するとfor inで使った変数に値が残ったままになる副作用があるります。

>>> squers = []
>>> for x in range(10):
...     squers.append(x**2)
>>> squers
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> x
9

この副作用をなくすにはmap()を使う方法があります。

squers = list(map(lambda x: x**2,range(10))

更にもっと見通しの良いのが内包表記です。

squers = [x**2 for x in range(10)]

>>> squers
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> x
Traceback (most recent call last):
File ““, line 1, in
NameError: name ‘x’ is not defined

内包表記は複合式や入れ子の関数を使うことが可能です。

[str(round(pi,i)) for i in range(1,6)]

結果
[‘3.1’, ‘3.14’, ‘3.142’, ‘3.1416’, ‘3.14159’]

入れ子のリスト内包

>>> matrix = [
... [1,2,3,4],
... [5,6,7,8],
... [9,10,11,12],
... ]
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

これは、zip()でも同等のことができます。

>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]