Atom's tech blog

Pythonを勉強しよう! データを管理するリストについて

f:id:iAtom:20201115173722j:plain

Python初心者の備忘録.....

今回はよく使われるリスト型についてです。

Pythonではデータ型として「 リスト型 」と「 タプル型 」があり、どちらも一つの変数に複数の要素を格納できることが特徴です。C言語では配列が近いです。

リストの生成

リストを生成するには、以下のように記述します。

要素が整数の場合
num = [ 0 , 1 , 2 , 3 , 4 , 5 ]
要素が文字列の場合
fruits = [ 'apple' , 'orange' , 'banana' ]
空のリスト(スクエアブラケット)
fruits = [ ]
空のリスト(list()コンストラクタ)
fruits = list()

リスト要素の追加

リストに要素を追加するときは、「 append() 」、「 insert() 」メソッドを使用し、 リストに別のリストを追加するときは「 extend() 」を使用します。

また新しい要素を配列指定「 += 」して追加もできます。

append()メソッド

「 append() 」メソッドを使用することで、末尾に追加していきます。

# 空のリストを作成
fruits = list()
# リストに追加
fruits.append('apple')
print(fruits)
# リスト末尾に追加
fruits.append('orange')
print(fruits)

# 出力結果
# ['apple']
# ['apple', 'orange']

出力結果より順番に追加されていることがわかります。

新しい要素を配列指定

「 += ['banana'] 」で末尾に追加していきます。

fruits = [ 'apple' , 'orange' ]
# リスト最後に追加
fruits += ['banana']
print(fruits)

# 出力結果
# ['apple', 'orange', 'banana']
insert()メソッド

「 insert() 」メソッドを使用することで、リストの途中に追加することができます。

そのためにはリストの途中のインデックスを知る必要があります。

   リスト.insert(インデックス, 値)
fruits = [ 'apple' , 'orange' , 'banana' ]
# リスト先頭に追加 
fruits.insert(0, 'strawberry')
print(fruits)
# リスト末尾に追加
fruits.insert(-1 , 'melon')
print(fruits)

# 出力結果
# ['strawberry', 'apple', 'orange', 'banana']
# ['strawberry', 'apple', 'orange', 'melon', 'banana']

インデックスに「 0 」を指定した場合は、リストの先頭へ挿入。「 -1 」を指定した場合は、リストの最後の要素の一つ前に挿入となります。

extend()メソッド

「 extend()メソッド 」を使用することで、別のリストを一つのリストに追加することができます。

   リスト.extend(リスト)
fruits1 = [ 'apple' , 'orange' , 'banana' ]
fruits2 = [ 'strawberry' , 'melon']
# リストに追加
fruits1.extend(fruits2)
print(fruits1)

# 出力結果
# ['apple', 'orange', 'banana', 'strawberry', 'melon']

この他に「 extend() 」メソッドを使用せず、「 += 」でも同等の結果が得られます。

fruits1 = [ 'apple' , 'orange' , 'banana' ]
fruits2 = [ 'strawberry' , 'melon']
# リストに追加
fruits1 += fruits2
print(fruits1)

# 出力結果
# ['apple', 'orange', 'banana', 'strawberry', 'melon']

リスト要素の更新

リストは「ミュータブル」で要素の変更ができます。要素を変更したい場合、[ ](スクエアブラケット)にインデックス値をつけて、直接要素にアクセスします。

fruits = [ 'apple' , 'orange' , 'banana' ]
# リスト最後を変更する
fruits[2] = 'melon' 
print(fruits)

# 出力結果
# ['apple', 'orange', 'melon']

リスト要素の削除

リストに要素を削除するときは、「 pop() 」、「 del 」、「 remove() 」、「 clear() 」を使用します。

pop()メソッド

リストのインデックスを指定して、リストから削除します。削除した要素は戻り値で返却されます。

インデックスで「 -1 」を指定したとき、パラメータ指定しない場合は、末尾として削除されます。

・インデックスを指定した場合

fruits = [ 'apple' , 'orange' , 'banana' ]
# リストの2番目'orange'を削除する
delValue = fruits.pop(1) 
print(fruits)

# 出力結果
# ['apple', 'banana']

・インデックスを指定しない場合

fruits = [ 'apple' , 'orange' , 'banana' ]
# リスト最後の'banana'を削除する
delValue = fruits.pop() 
print(fruits)

# 出力結果
# ['apple', 'orange']

del演算子

del演算子は、要素を削除したい場合、[ ](スクエアブラケット)にインデックス値をつけて、直接要素にアクセスします。

   del [ 先頭のインデックス : 最後尾のインデックス ]

削除する先頭インデックスのみ指定した場合、そのインデックスのみ削除されます。

・先頭インデックスのみ指定した場合

fruits = [ 'apple' , 'orange' , 'banana' ]
# リストの'orange'を削除する
del fruits[1]
print(fruits)

# 出力結果
# ['apple', 'banana']

・両方を指定した場合

fruits = [ 'apple' , 'orange' , 'banana' ]
# リストの'orange, banana'を削除する
del fruits[1:3]
print(fruits)

# 出力結果
# ['apple']
remove()メソッド

リストから削除する場合、インデックスがわかるケースであれば、pop()やdel演算子が使用できますが、インデックス値がわからないケースもあります。そのときは「 remove() 」メソッドで要素の値を指定して削除します。

尚、リスト内に同じ要素値があった場合は、インデックス値の小さい方が削除され、インデックス値が大きい方は削除されません。

fruits = [ 'apple' , 'orange' , 'banana' ]
# リストの'orange'を削除する
fruits.remove('orange')
print(fruits)

# 出力結果
# ['apple', 'banana']
clear()メソッド

本メソッドは、リスト内の要素を全て削除する時に使用します。

fruits = [ 'apple' , 'orange' , 'banana' ]
# リストを全削除
fruits.clear()
print(fruits)

# 出力結果
# []
スライスを用いた全削除
fruits = [ 'apple' , 'orange' , 'banana' ]
# リストを全削除
fruits[:] = []
print(fruits)

# 出力結果
# []

リスト要素を取り出す(スライス)

スライスとは、リストから新しいリストを取り出して、その取り出したリストを返すことを「 スライス 」と呼びます。

開始インデックスと終了インデックスを指定することで、リスト内のインデックス範囲を取得することができます。

終了インデックスがマイナスの場合は、リストの最後位置からの数を意味します。

・リストのスライス指定

   リスト[開始インデックス:終了インデックス:ステップ数]

・サンプルコード

fruits = [ 'apple' , 'orange' , 'banana' ,  'lemon' , 'strawberry' , 'melon' ]
# 2番目と3番目を取得
print(fruits[1:3])
# 開始インデックスが無い場合は先頭(1番目)
# このスライスは1番目〜3番目を示している
print(fruits[:3])
# 終了インデックスが無い場合は最後
# このスライスは5番目〜6番目を示している
print(fruits[4:])
# 終了インデックスがマイナスの場合は、最後からの数
# このスライスは先頭〜後ろから3番目までを示している
print(fruits[0:-2])

# 出力結果
# ['orange', 'banana']
# ['apple', 'orange', 'banana']
# ['strawberry', 'melon']
# ['apple', 'orange', 'banana', 'lemon']

リスト要素数取得

リスト要素の数は「 len() 」やNumPyライブラリの「 Numpy配列(ndarray型) 変換 」で取得することができます。

「 len() 」は二次元配列などでも可能ですが、二次元配列はリスト内のリスト数変えるため、注意が必要です。

 一次元リスト

len()関数の場合
fruits = [ 'apple' , 'orange' , 'banana' ]
# list内の要素数を取得
lenCnt = len(fruits)
print(lenCnt)

# 出力結果
# 3
Numpy配列(ndarray型) 変換の場合

list型をNumpy配列(ndarray型) に変換し、sizeで要素数を取得できます。

import numpy as np

fruits = ['apple' , 'orange' , 'banana']
# Numpy配列(ndarray型)に変換
ndarrayList = np.array(fruits)
print(ndarrayList.size)

# 出力結果
# 3

二次元リスト

len()関数の場合

二次元リストで「 len() 」を使用すると、リスト内のリスト数が取得できます。意図的にリスト数を取得する目的であれば「 len() 」使用は問題ありません。

リスト内の要素数を取得はできないため、取得したいときはループ文と「 sum() 」活用する必要があります。

fruits = [['apple' , 'orange' , 'banana'], ['lemon' , 'strawberry' , 'melon']]
# list内のlist数を取得
lenCnt = len(fruits)
print(lenCnt)

# list内の要素数を取得
lenCnt = sum([len(item) for item in fruits])
print(lenCnt)

# 出力結果
# 2
# 6
Numpy配列(ndarray型) 変換の場合

list型をNumpy配列(ndarray型) に変換し、sizeで要素数を取得できます。こちらは、多次元でも同様です。

import numpy as np

fruits = [['apple' , 'orange' , 'banana'], ['lemon' , 'strawberry' , 'melon']]
# Numpy配列(ndarray型)に変換
ndarrayList = np.array(fruits)
print(ndarrayList.size)

# 出力結果
# 6

リストのコピー

リスト変数をたの別リスト変数に代入すると、メモリアドレスも代入します。

そのため、コピー後に別リストへアクセスすると、最初のコピー元のリストまで変更されてしまいます。

そのときは、「 copy() 」メソッドを使用してコピーしましょう。このメソッドを使用することで、独立した変数をして扱うことができます。

別変数に代入した場合
fruits1 = [ 'apple' , 'orange' , 'banana' ,  'lemon' , 'strawberry' , 'melon' ]
# fruts1リストをfruits2へ代入
fruits2 = fruits1
# fruits2の要素を変更
fruits2[0] = 'pineapple'
print(fruits1)

# 出力結果
# ['pineapple', 'orange', 'banana', 'lemon', 'strawberry', 'melon']

上記サンプル、リストをコピーしても別変数へコピーしたものは独立した変数とはならない。

fruits1 = [ 'apple' , 'orange' , 'banana' ,  'lemon' , 'strawberry' , 'melon' ]
# fruts1リストをfruits2へ代入
fruits2 = fruits1.copy()
# fruits2の要素を変更
fruits2[0] = 'pineapple'
print(fruits1)
print(fruits2)

# 出力結果
# ['apple', 'orange', 'banana', 'lemon', 'strawberry', 'melon']
#['pineapple', 'orange', 'banana', 'lemon', 'strawberry', 'melon']

上記サンプル。リストを「 copy() 」メソッドを使用することで、別変数は独立した変数として扱うことができる。

他にもリストの並べ替えに「 reverse() 」(リストの反転)、「 sort() 」(リストの並び順をソート)がありますが、ここでは説明は割愛します。