複数の値をまとめて扱うのにリストを使えば便利です。ほかの言語の配列のように使うことができます。
リストの基本
リストは、[] で囲って表します。値は「,」で区切ります。
print() は出力で、type() はオブジェクトの型を確認します。
print() についてはこちらの記事を参照ください。
# 整数のリスト
a = [0, 1, 2, 3]
print(type(a)) # => <class 'list'>
# 浮動小数点数のリスト
[1.2, 2.4, 3.6]
# 文字列のリスト
['Alice', 'Bob']
# いろいろな型が混ざってもいい
['Alice', 10, 5.8, True]
list() を使うこともできます。range() と組み合わせれば連続した数のリストを作れます。
a = list((1, 2, 3))
print(type(a)) # => <class 'list'>
print(a) # => [1, 2, 3]
b = list(range(5))
print(b) # => [0, 1, 2, 3, 4]
list() に文字列を渡せば、1文字ずつのリストが作られます。
a = ['Python']
print(a) # => ['Python']
b = list('Python')
print(b) # => ['P', 'y', 't', 'h', 'o', 'n']
* 演算子を使えば、同じ要素のリストを作れます。
a = [0] * 5
print(a) # => [0, 0, 0, 0, 0]
b = ['ABC'] * 3
print(b) # => ['ABC', 'ABC', 'ABC']
空のリストは次のように宣言します。
# 空のリストの宣言
a = list()
print(a) # => []
# これでも空のリストの宣言ができる
b = []
print(b) # => []
要素にアクセス
リストの要素にアクセスするには、インデックスを使ってアクセスします。
先頭の要素はインデックスが 0 になります。
a = [0, 1, 2, 3]
print(a[0]) # => 0
print(a[3]) # => 3
b = ['zero', 1.0, 2, True]
print(b[0]) # => zero
print(b[1]) # => 1.0
print(b[2]) # => 2
print(b[3]) # => True
リストの要素の末尾からアクセスするには、負のインデックスを使います。
末尾の要素はインデックスが ‐1 になります。0 と -0 は区別ができないので末尾の要素は -1 です。
a = [0, 1, 2, 3]
print(a[-1]) # => 3
print(a[-2]) # => 2
print(a[-3]) # => 1
print(a[-4]) # => 0
範囲外にアクセスするとエラーになります。
a = [0, 1, 2, 3]
print(a[8]) # => エラーになる
リストの値を更新することもできます。
a = [0, 1, 2, 3]
print(a) # => [0, 1, 2, 3]
a[1] = 100 # インデックスが 1 の要素に 100 を格納
print(a) # => [0, 100, 2, 3]
要素の数を取得
len() を使えば、リストの要素数を取得できます。
print(len([1, 2, 3, 4])) # => 4
a = ['Alice', 'Bob', 'Tom']
print(len(a)) # => 3
要素が存在するか
in を使えば、リストの中に要素が存在するか確認できます。
a = [0, 1, 2, 3]
print(2 in a) # => True
print(8 in a) # => False
# 文字列なので False になる
print('2' in a) # => False
b = ['Alice', 'Bob', 'Tom']
print('Bob' in b) # => True
print('bob' in b) # => False
print('Bo' in b) # => False
最大・最小の要素を取得
max() を使えば、リストの最大値を取得できます。min() は、最小値を取得できます。
a = [3, 0, 5, -100, 1, 100, 8]
print(max(a)) # => 100
print(min(a)) # => -100
リストの合計を取得
sum() を使えば、リストの要素の合計を取得できます。
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(sum(a)) # => 55
リストの繰り返し
for を使えばリストの要素について簡単に繰り返し処理できます。
userList = ['Alice', 'Bob', 'Tom', 'Eve']
# リストの要素について繰り返し処理
for user in userList:
print(user)
"""実行結果
Alice
Bob
Tom
Eve
"""
リスト内包表記
リスト内包表記を利用すれば、リストを簡単に生成できます。
たとえば、リスト内包表記を使わずに偶数のリストを作るときは次のように書きます。
append() はリストの末尾に要素を追加します。
a = []
for i in range(5):
a.append(i * 2)
print(a) # => [0, 2, 4, 6, 8]
リスト内包表記を使えばもっと簡単にリストを作れます。
[式 for 変数 in イテラブルオブジェクト]
a = [i * 2 for i in range(5)]
print(a) # => [0, 2, 4, 6, 8]
if も使うことができます。
[式 for 変数 in イテラブルオブジェクト if 条件式]
a = [i for i in range(10) if i % 2 == 0]
print(a) # => [0, 2, 4, 6, 8]
# 以下のコードと同じです。
a = []
for i in range(10):
# 偶数の判定
if i % 2 == 0:
a.append(i)
print(a)
リスト内包表記をネストすることもできます。
a = [[i, j] for i in range(2) for j in range(3)]
print(a) # => [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2]]
# 以下のコードと同じです。
a = []
for i in range(2):
for j in range(3):
a.append([i, j])
print(a) # => [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2]]
スライス
スライスを使えば、リストの一部を簡単に取得できます。
次のように「 : 」を使います。start と stop は取得したいインデックスを指定します。
list[start:stop]
a = [0, 1, 2, 3, 4, 5]
print(a[0:2]) # => [0, 1]
print(a[4:6]) # => [4, 5]
print(a[3:5]) # => [3, 4]
print(a[3:-1]) # => [3, 4]
b = a[1:5]
print(b) # => [1, 2, 3, 4]
print(a) # => [0, 1, 2, 3, 4, 5]
スライスの start と stop は省略することができます。start を省略したときは先頭に、stopを省略したときは最後になります。
a = [0, 1, 2, 3, 4, 5]
print(a[:3]) # => [0, 1, 2]
print(a[3:]) # => [3, 4, 5]
スライスを使って、値を格納することもできます。
a = ['a', 'b', 'c', 'd', 'e']
a[2:4] = ['C', 'D']
print(a) # => ['a', 'b', 'C', 'D', 'e']
リストのネスト
リストをネストすることで、2次元配列のように使えます。
a = [
['0-0', '0-1', '0-2'],
['1-0', '1-1', '1-2'],
['2-0', '2-1', '2-2']
]
print(a) # => [['0-0', '0-1', '0-2'], ['1-0', '1-1', '1-2'], ['2-0', '2-1', '2-2']]
print(a[0]) # => ['0-0', '0-1', '0-2']
print(a[0][0]) # => 0-0
print(a[1][0]) # => 1-0
print(a[2][2]) # => 2-2
要素数が異なっていても問題ありません。
a = [
['0-0', '0-1', '0-2'],
['1-0'],
['2-0', '2-1']
]
print(a) # => [['0-0', '0-1', '0-2'], ['1-0'], ['2-0', '2-1']]
print(a[0]) # => ['0-0', '0-1', '0-2']
print(a[1]) # => ['1-0']
print(a[2]) # => ['2-0', '2-1']
複数の型がまざっていても大丈夫です。
a = [[1, 'Alice', True],[2.0, 'Bob', 3]]
print(a[0][1]) # => Alice
print(a[1][2]) # => 3
リストのメソッド
append
append() メソッドは、リストの末尾に要素を追加します。
list.append(x)
a = []
a.append(0)
print(a) # => [0]
a.append(1)
print(a) # => [0, 1]
a.append('two')
print(a) # => [0, 1, 'two']
a.append(3.3)
print(a) # => [0, 1, 'two', 3.3]
extend
extend() メソッドは、リストを結合できます。
list.extend(iterable)
a = [0, 1, 2]
b = [3, 4]
a.extend(b)
print(a) # => [0, 1, 2, 3, 4]
print(a[3]) # => 3
print(b) # => [3, 4]
a.extend([5, 6])
print(a) # => [0, 1, 2, 3, 4, 5, 6]
append() だと次のようになります。
a = [0, 1, 2]
b = [3, 4]
a.append(b)
print(a) # => [0, 1, 2, [3, 4]]
print(a[3]) # => [3, 4]
insert
insert() メソッドは、指定したインデックスに要素を挿入できます。
list.insert(index, x)
第一引数の indexの要素の前に x が挿入されます。
a = [1, 3]
a.insert(1, 2)
print(a) # => [1, 2, 3]
a.insert(0, 'zero')
print(a) #=> ['zero', 1, 2, 3]
del
del() メソッドは、指定したインデックスの要素を削除します。
list.del(index)
a = ['a', 0, 'Bob', 1, 2]
# 'Bob'の削除
a.del(2)
print(a) # => ['a', 0, 1, 2]
# 'a'の削除
a.del(0)
print(a) # => [0, 1, 2]
clear
clear() メソッドは、リストの全要素を削除します。
list.clear()
a = [0, 1, 2, 3, 4, 5]
a.clear()
print(a) # => []
remove
remove() メソッドは、リストに含まれる x と等しい最初の要素を削除します。
list.remove(x)
a = ['Alice', 'Bob', 'Tom', 'Bob', 'Eve']
a.remove('Eve')
print(a) # => ['Alice', 'Bob', 'Tom', 'Bob']
# 最初の Bob が削除される
a.remove('Bob')
print(a) # => ['Alice', 'Tom', 'Bob']
pop
pop() メソッドは、指定したインデックスの要素をリストから削除して取り出します。
list.pop([index])
index は省略可能で、省略したときは末尾の要素になります。
l = ['Alice', 'Bob', 'Tom', 'Bob', 'Eve']
a = l.pop(0)
print(a) # => Alice
print(l) # => ['Bob', 'Tom', 'Bob', 'Eve']
b = l.pop(1)
print(b) # => Tom
print(l) # => ['Bob', 'Bob', 'Eve']
# index を省略したときは -1 と同じ
c = l.pop()
print(c) # => Eve
print(l) # => ['Bob', 'Bob']
sort
sort() メソッドは、要素を並び替えます。
list.sort(*, key=None, reverse=False)
key は、並び替える前にリストの各要素に対して呼び出す関数を指定します。関数から返される値で並び替えを行います。
reverse に True を指定したときは、降順で並び替えられます。指定しないときは False です。
a = [4, 2, 1, 3, 0]
a.sort()
print(a) # => [0, 1, 2, 3, 4]
# 降順で並び替え
b = [2, 0, 3, 1]
b.sort(reverse=True)
print(b) # => [3, 2, 1, 0]
key を指定した場合です。abs は絶対値を返す関数で、int は整数を返す関数です。
a = [1, -3, 4, -2]
a.sort()
print(a) # => [-3, -2, 1, 4]
b = [1, -3, 4, -2]
# 絶対値で並び替え
b.sort(key=abs)
print(b) # => [1, -2, -3, 4]
c = [1, -3, 4, -2, '0']
# 整数に変換して並び替え
c.sort(key=int)
print(c) # => [-3, -2, '0', 1, 4]
リスト自体を変化させたくないときは、sorted() を使います。sorted() も key と reverse を指定することができます。
a = [4, 2, 1, 3, 0]
b = list(sorted(a))
print(b) # => [0, 1, 2, 3, 4]
# a は元のまま
print(a) # => [4, 2, 1, 3, 0]
# reverse も指定できる
print(sorted(a, reverse=True)) # => [4, 3, 2, 1, 0]
reverse
reverse() メソッドは、要素を反転させます。
list.reverse()
a = [4, 2, 1, 3, 0]
a.reverse()
print(a) # => [0, 3, 1, 2, 4]
リスト自体を変化させたくないときは、reversed() を使います。
a = [4, 2, 1, 3, 0]
b = list(reversed(a))
print(b) # => [0, 3, 1, 2, 4]
# a は元のまま
print(a) # => [4, 2, 1, 3, 0]
count
count() メソッドは、リストに含まれる x の個数を取得できます。
list.count(x)
a = ['Alice', 'Bob', 'Tom', 'Bob', 'Eve']
print(a.count('Alice')) # => 1
print(a.count('Bob')) # => 2
print(a.count('John')) # => 0
index
index() メソッドは、リストに含まれる x と等しい最初の要素のインデックスを取得できます。
list.index(x[, start[, end]])
start と end は省略可能です。指定したときは、リストの探索する開始位置と終了位置になります。
a = ['Alice', 'Bob', 'Tom', 'Bob', 'Eve']
print(a.index('Alice')) # => 0
print(a.index('Eve')) # => 4
# Bob は2つあるが、インデックスが小さいものを取得
print(a.index('Bob')) # => 1
# インデックスが2から検索
print(a.index('Bob', 2)) # => 3
# 値がないときはエラーになる
print(a.index('John'))
# インデックスが0から3までの検索のためエラーになる
print(a.index('Eve', 0, 3))
スタックとして使う
リストのメソッドを使えば、スタックのように使うことができます。
- 一番上に要素を追加する:list.append(x)
- 一番上の要素を取得する:list[-1]
- 一番上の要素を取り出す:list.pop()
stack = []
stack.append('cat')
stack.append('dog')
stack.pop()
stack.append('ant')
print(stack) # => ['cat', 'ant']
キューとして使う
リストをキューとして使うこともできます。しかし、先頭要素を取り出す処理には時間がかかるので注意が必要です。
- 最後尾に要素を追加:list.append(x)
- 先頭の要素を取得する:list[0]
- 先頭の要素を取り出す:list.pop(0)
collections.deque を使えば、リストを使うより高速にキューを実装できます。
from collections import deque
queue = deque()
queue.append('ant')
queue.append('dog')
queue.popleft()
queue.append('cat')
print(queue) # => deque(['dog', 'cat'])
# pop()も実装されています
queue.pop()
# 先頭に要素の追加もできます
queue.appendleft('cow')
print(queue) # => deque(['cow', 'dog'])
まとめ
# リストの作成
a = [0, 1, 'two', 3.3]
a = list((0, 1, 2))
a = [0] * 5 # => [0, 0, 0, 0, 0]
# 空のリスト
a = []
a = list()
# 文字列の1文字ずつのリスト
a = list('Python') # => ['P', 'y', 't', 'h', 'o', 'n']
# 先頭の要素
a[0] # => 'P'
# 末尾の要素
a[-1] # => 'n'
# 'n'が存在するか
'n' in a # => True
a = [0, 1, 2, 3, 4]
# 最大値の取得
max(a) # => 4
# 最小値の取得
min(a) # => 0
# 合計の取得
sum(a) # => 10
# 繰り返し
for i in a:
print(i)
# リスト内包表記
a = [i * 2 for i in range(5)]
# スライス
a = [0, 1, 2, 3, 4, 5]
print(a[0:2]) # => [0, 1]
# リストのメソッド
fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
print(fruits.count('apple')) # => 2
print(fruits.index('banana')) # => 3
print(fruits.index('banana', 4)) # => 6
fruits.reverse()
print(fruits) # => ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']
fruits.append('grape')
print(fruits) # => ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']
fruits.sort()
print(fruits) # => ['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']
a = fruits.pop()
print(a) # => pear