目次
Python のリストの操作の基本についてまとめました。
環境
次の環境で検証をしています。
- Python 3.6.5
リスト
リストは値の連なりです。 リスト内の各値を、要素(element)またはアイテム(item)と呼びます。
リストは [ ]
の中に要素となる値をカンマ区切りで記述して定義できます。 ひとつのリストに含まれる要素は、ひとつの型に限定する必要はなく。複数の型を混在させることができます。 また、リストは要素としてリストを含むことができます。
ひとつも要素を含まない空リスト(empty list)を生成することもでき、 []
のように記述します。
1 2 3 4 |
[1, 2, 3] ["hello", "world"] [True, 0, "yesterday", ["a", "b"]] [] |
リストの長さ取得
リストの長さ(要素数)は len
関数 で取得できます。 引数に、要素数を計算したいリストを渡すと、 要素数が返されます。
1 2 |
len([1, 2, 3]) # => 3 |
各要素へのアクセス
リストの各要素へは、 リストの直後にアクセスしたい要素のインデックスを、 [ ]
で囲んで記述します。 マイナスの値を指定した場合は、 その数にリストの要素数を足した数をインデックスとする要素にアクセスできます。
1 2 3 4 5 6 7 8 9 |
[1, 2, 3][1] # => 2 l = ["a", "b", "c"] l[2] # => "c" l[-1] # => "c" |
リストの要素は変更可能で、 代入演算子(=
)を用いて次のように変更します。
1 2 3 4 5 |
l = [1, 2, 3, 4, 5] l[1] = 10 print(l) # => [1, 10, 3, 4, 5] |
部分リストへのアクセス
スライス機能を使って部分リストにアクセスできます。
要素にアクセスする時と同じように [ ]
を記述します。 [ ]
の中には インデックスを :
で区切って記述します。
あるインデックス以降の要素全て
[開始インデックス:]
のように記述します。 開始インデックスが指す要素以降の要素全てに、リストとしてアクセスできます。
開始インデックスに負の値を指定した場合、開始インデックスにリストの要素数を足した数が開始インデックスとなります。
1 2 3 4 5 6 7 |
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l[5:] # => [6, 7, 8, 9, 10] l[-5:] # => [6, 7, 8, 9, 10] |
開始インデックスを省略すると、0を指定したのと同じになります。
あるインデックスより前の要素全て
[:終了インデックス]
のように記述します。 終了インデックスが指す要素より前の要素全てに、リストとしてアクセスできます。
終了インデックスに負の値を指定した場合、終了インデックスにリストの要素数を足した数が終了インデックスとなります。
1 2 3 4 5 6 7 |
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l[:5] # => [1, 2, 3, 4, 5] l[:-5] # => [1, 2, 3, 4, 5] |
終了インデックスを省略すると、要素数を指定したのと同じになります。
要素の順番を指定
[::ステップ]
のように指定すると、最初の要素から順にステップだけ進んだ要素を部分リストの要素にします。
ステップに負の値を指定した場合、最後の要素から順にステップの絶対値の数だけ前の要素を部分リストの要素にします。
1 2 3 4 5 6 7 |
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l[::2] # => [1, 3, 5, 7, 9] l[::-2] # => [2, 4, 6, 8, 10] |
ステップを省略すると、1を指定したのと同じになります。
組み合わせ
上述の3つのフィルタ方法を合わせて、部分リストにアクセスできます。
1 2 3 4 |
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l[2:8:2] # => [3, 5, 7] |
値の変更
部分リストを使って特定の要素の値を変更できます。
1 2 3 4 5 |
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l[2:8:2] = [-1, -2, -3] print(l) # output: [1, 2, -1, 4, -2, 6, -3, 8, 9, 10] |
要素がリストに含まれているか確認する
ある要素がリストに含まれているかを確認するには in
を使います。
1 2 3 4 5 6 7 |
l = [1, 2, 3, 4, 5] 1 in l # => True 6 in l # => False |
リストの要素を変更する
要素の追加 append
リストに要素を追加するときは append
メソッド を利用します。 append
メソッド は値を返しません。
1 2 3 4 5 |
a = [1] a.append(2) print(a) # output: [1, 2] |
要素の削除
インデックスを指定して取り出す pop
pop
メソッド は、 リストの要素のインデックスを指定して実行すると、 そのインデックスが指す要素を取り出します。 取り出された後のリストは要素がひとつ減ります。 もし引数を省略して実行した場合はリストの末尾の要素が取り出され、削除されます。 pop
メソッド の返り値は、取り出された要素です。
1 2 3 4 5 6 7 |
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l.pop() # => 10 l.pop(2) # => 3 |
削除のみ行う del
変数の削除にも使う del
で要素を削除できます。 返り値はありません。
del
の後にカンマ区切りで リスト変数[インデックス]
を並べると、 順番に該当の要素が削除されます。 del
の後ろには、 スライス機能を使って複数の要素を一度に指定することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
l = [1, 2, 3, 4, 5, 6, 7] del l[3] print(l) # output: [1, 2, 3, 5, 6, 7] del l[1], l[3] print(l) # output: [1, 3, 5, 7] del l[1:2] print(l) # output [1, 7] l = [1, 2, 3, 4, 5, 6, 7] del l[1:5:2] print(l) # output: [1, 3, 5, 6, 7] |
最初の要素から数えて一致した要素を削除する remove
最初の要素から数えて一致した要素を削除するには remove
メソッド を使います。 引数には、消したい要素の値を割り当てます。 remove
メソッド の返り値はありません。
1 2 3 4 |
l = [1, 2, 3, 1, 2, 3, 1, 2, 3] l.remove(2) print(l) # => [1, 3, 1, 2, 3, 1, 2, 3] |
リストの要素をイテレートする
リストの要素についてイテレートする場合には、 for 変数名 in リスト:
のように for
文 のヘッダを記述します。
リストのメソッド・演算
連結 +
, +=
, extend
2つのリストを +
で連結できます。
1 2 3 4 5 6 |
a = [1, 2, 3, 4] b = [5, 6, 7, 8] a + b # => [1, 2, 3, 4, 5, 6, 7, 8] |
あるリストを参照する変数にリストを連結して、変数の指すリストを変更する場合は +=
または extend
を使います。 extend
メソッド は値を返しません。
1 2 3 4 5 6 7 8 9 |
l = [1] l += [2] print(l) # output: [1, 2] l.extend([3]) print(l) # output: [1, 2, 3] |
複製と連結 *
リストに *
を使うと、 そのリストを指定された回数だけ連結したリストが生成されます。 *
の後には int
を記述可能です。 もし負の値を記述した場合は 0
を指定した場合と同じ結果、 空のリスト が返ります。
変数がリストを参照していて、 そのリスト時針を複数回連結して再度変数に代入したい場合には *=
演算子 を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[0] * 4 # => [0, 0, 0, 0] [1, 2] * 3 # => [1, 2, 1, 2, 1, 2] [1, 2] * 0 # => [] [1, 2] * -10 # => [] l = [1, 2, 3] l *= 3 print(l) # output: [1, 2, 3, 1, 2, 3, 1, 2, 3] |
リストの要素の並べ替え
昇順に変更する sort
リストの要素を昇順に並べ替える場合は sort
メソッド を使います。 sort
メソッド は値を返しません。
1 2 3 4 |
l = [10, 4, 2, 5, 6, 7, 3, 9, 8, 1] l.sort() print(l) # output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] |
順番を逆にする reverse
リストの要素を逆順にするには reverse
メソッド を使います。 reverse
メソッド は値を返しません。
1 2 3 4 5 |
l = [1, 9, 2, 8, 3, 7] l.reverse() print(l) # output: [7, 3, 8, 2, 9, 1] |
要素を使った計算
Map
リストの全要素に操作を施して別のリストを作る関数をマップといいます。
1 2 3 4 5 |
def double(l): r = [] for e in l: r.append(e * 2) return r |
Python の map
関数 を使ってマップを行うことも可能です。
1 2 |
list(map(lambda x: x * 2, [1, 2, 3])) # => [2, 4, 6] |
Filter
リストの要素のうち、特定の条件にあうものを取り出して新しいリストを作る関数をフィルタといいます。
1 2 3 4 5 6 |
def odd(l): r = [] for e in l: if e % 2 == 1: r.append(e) return r |
Python の filter
関数 を使ってフィルタを行うことも可能です。
1 2 |
list(filter(lambda x: x % 2 == 1, [1, 2, 3])) # => [1, 3] |
Reduce
リストの要素を計算して単一の値を返す関数を reduce といいます。
1 2 3 4 5 |
def multiple_all(l) r = 1 for e in l: r *= e return r |
この例でいう r
のような集約のための変数を アキュムレータ(accumulator) といいます。
Python の reduce
関数 を使うと同等のことができます。
1 2 |
from functools import reduce reduce(lambda x, y: x * y, [1, 2, 3]) |