TL;DR
Python には文字列以外に、タプルとリストの 2 種類のシーケンス(list, tuple, range)構造がある。リストはミュータブルであり、要素の挿入と削除を行うことができる。リストの内容は直接変更(要素の追加、削除、置換)できる。要素は異なっていてもよく、複雑で深いデータ構造を作ることができる。
list 型 のポイント
- list 型は、可変な配列を扱う型である
- 0 個以上の要素をそれぞれカンマで区切り、全体を[]で囲む
- 要素は異なっていてもよく、複雑で深いデータ構造を作ることができる
- タプルはイミュータブルであり、書き換え不可だが、
- リストはミュータブルであり、要素の挿入と削除を行うことができる
w = ['a', 'b', 'c']
type(w)
# list
タプルや文字列と同じように、リストでも繰り返し可能である。
['hello'] * 3
# ['hello', 'hello', 'hello']
list()
組み込み関数である list()で空リストを作ることができる。
a = list()
a
# []
list()関数は、タプル、文字列、辞書、集合などのイテラブルをリストに変換できる。
list('abcde')
# ['a', 'b', 'c', 'd', 'e']
a = ('A', 'B', 'C')
list(a)
# ['A', 'B', 'C']
list.append()
メソッド list.append()や +演算子
を使えば、リストの結合ができる。リストの末尾にしか要素を追加できない。
foods = ['pasta', 'curry', 'sushi']
foods.append('pizza')
foods
# ['pasta', 'curry', 'sushi', 'pizza']
foods = ['pasta', 'curry', 'sushi']
foods = ['soup'] + foods
foods
# ['soup', 'pasta', 'curry', 'sushi']
join()
join() を使うと、リストの要素を一つに結合する。要素間のセパレータ文字を指定可能である。
fruits = ['apple', 'banana', 'cherry']
'と'.join(fruits)
# appleとbananaとcherry
for
次のコードは for 文を使って、要素内を順に処理しているケースである。
fruits = ['apple', 'banana', 'cherry', 'lemon']
target = 'c'
for i in fruits:
if i.startswith(target):
print(f'{i}は、頭文字が{target}です')
break
else:
print(f'{i}は、頭文字が{target}ではありません')
# appleは、頭文字がcではありません
# bananaは、頭文字がcではありません
# cherryは、頭文字がcです
for が break されずに終了したときに実行される else を使ってみよう。
fruits = ['apple', 'banana', 'cherry', 'lemon']
target = 'd'
for i in fruits:
if i.startswith(target):
print(f'{i}は、頭文字が{target}です')
break
else:
print(f'{i}は、頭文字が{target}ではありません')
else:
print(f'結局、頭文字{target}の単語は存在しませんでした')
# appleは、頭文字がdではありません
# bananaは、頭文字がdではありません
# cherryは、頭文字がdではありません
# lemonは、頭文字がdではありません
# 結局、頭文字dの単語は存在しませんでした
要素を空にして、for が実行されない場合も、else に移る。
fruits = []
target = 'd'
for i in fruits:
if i.startswith(target):
print(f'{i}は、頭文字が{target}です')
break
else:
print(f'{i}は、頭文字が{target}ではありません')
else:
print(f'要素内に、頭文字{target}の単語は存在しませんでした')
# 要素内に、頭文字dの単語は存在しませんでした
for をネストさせる。
rows = ['1', '2']
cols = ['A', 'B']
for row in rows:
for col in cols:
print(row, col)
# 1 A
# 1 B
# 2 A
# 2 B
リスト内包表記
リスト内包表記を使って、1 から 4 までの整数リストを作る。
w = [i for i in range(1,5)]
w
# [1, 2, 3, 4]
次に示すコードは、1 から 10 までの整数のうち、奇数のみを抽出したものである。
w = []
for i in range(1, 11):
if i % 2 == 1:
w.append(i) # w += [i] でもOK
w
# [1, 3, 5, 7, 9]
上と同じものをリスト内包表記を使って書くと簡潔になる。
w = [i for i in range(1, 11) if i % 2 == 1]
w
# [1, 3, 5, 7, 9]
insert()
リストのオフセットを指定し、任意の場所に要素を追加する場合は、insert()を使う。オフセットを 0 にするとリストの先頭に追加される。オフセットを越える数値を入れると末尾に追加される。
fruits = ['apple', 'banana', 'cherry']
fruits.insert(2, 'lemon')
fruits
# ['apple', 'banana', 'lemon', 'cherry']
fruits = ['apple', 'banana', 'cherry']
fruits.insert(10, 'lemon')
fruits
# ['apple', 'banana', 'cherry', 'lemon']
list.pop()
list.pop()を使うとリストから要素を取り出し、同時に削除もできる。
fruits = ['apple', 'banana', 'cherry', 'lemon']
fruits.pop() #'lemmon'
fruits
# ['apple', 'banana', 'cherry']
del
del 文もリストの中にある要素を指定して削除できる。
foods = ['pasta', 'curry', 'sushi']
del foods[1]
foods
# ['pasta', 'sushi']
split()
split()関数を使うと、セパレータに基づいて文字列を分割してリストに変換できる。
'2021/10/12'.split('/')
# ['2021', '10', '12']
url = 'https://example.com'
domain = url.split('//')
del domain[0]
domain
# ['example.com']
offset
オフセットを指定すればリストから、要素を取り出せる。
foods = ['pasta', 'curry', 'sushi']
foods[2]
# 'sushi'
foods = ['pasta', 'curry', 'sushi']
foods[-1]
# 'sushi'
リストのリストは次のように指定するとよい。
w = ['a', ['b', 'c'], 'd']
w[1][1]
# 'c'
オフセットを使えば、要素の書き換えができる。
foods = ['pasta', 'curry', 'sushi', 'pizza']
foods[1] = 'banana'
foods
# ['pasta', 'banana', 'sushi', 'pizza']
スライス
[]の中に :
を入れると、スライス操作ができる。
[先頭のインデックス:末尾のインデックス]
[3:]
オフセット 3 から末尾までを取得[1:4]
2 つ目から 5 つ目までを取得[-1:]
最後の 文字列を取得[5::2]
オフセット 5 から末尾まで 2 文字ごとに取得[:5:2]
先頭からオフセット 5 まで 2 文字ごとに取得[-1::-1]
末尾から先頭まで逆順に取得[::-1]
末尾から先頭まで逆順に取得
次のコードにある [0:2]
は、0 から 1 つ目までを取り出している。
foods = ['pasta', 'curry', 'sushi', 'pizza']
foods[0:2]
# ['pasta', 'curry']
foods = ['pasta', 'curry', 'sushi', 'pizza']
foods[3:]
# ['pizza']
foods = ['pasta', 'curry', 'sushi', 'pizza']
foods[-1:]
# ['pizza']
foods = [1,2,3,4,5,6,7,8]
foods[1::2]
# [2, 4, 6, 8]
foods = [1,2,3,4,5,6,7,8]
foods[-1::-1]
# [8, 7, 6, 5, 4, 3, 2, 1]
オフセットによる要素の書き換え
右辺と左辺の要素数が同じでなくてもかまわない。
n = [1, 2, 3, 4, 5, 6, 7]
n[1:5] = [10, 11, 12]
n
# [1, 10, 11, 12, 6, 7]
これを応用すればオフセットの中身を一括で削除することもできる。
n = [1, 2, 3, 4, 5, 6, 7]
n[1:-1] = []
n
# [1, 7]
zip()
zip()関数を使えば、複数のシーケンスをペアにすることができる。zip()は最も短いシーケンスの要素を処理し尽くしたときに停止する。
weeks = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
day = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list(zip(weeks, day))
# [('Sunday', 1),
# ('Monday', 2),
# ('Tuesday', 3),
# ('Wednesday', 4),
# ('Thursday', 5),
# ('Friday', 6),
# ('Saturday', 7)]
dict() に渡すと辞書ができる。
weeks = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
day = [1, 2, 3, 4, 5, 6, 7, 8, 9]
dict(zip(weeks, day))
# {'Friday': 6,
# 'Monday': 2,
# 'Saturday': 7,
# 'Sunday': 1,
# 'Thursday': 5,
# 'Tuesday': 3,
# 'Wednesday': 4}
remove()
削除したい要素のインデックスが不確定の場合、remove()を使って指定した要素を削除できる。
foods = ['pasta', 'curry', 'sushi', 'pizza']
foods.remove('curry')
foods
# ['pasta', 'sushi', 'pizza']
list.reverse()
list.reverse() はリストを直接逆順に書き換える。
w = [1,2,3,4,5]
w.reverse()
w
# [5, 4, 3, 2, 1]
extend()
extend() を使うと、複数のリストを一つにまとめることができる。
x = ['apple', 'banana']
y = ['tomato', 'potato']
x.extend(y)
x
# ['apple', 'banana', 'tomato', 'potato']
append()を使うと、リストが 1 個の要素として追加される。
x = ['apple', 'banana']
y = ['tomato', 'potato']
x.append(y)
x
# ['apple', 'banana', ['tomato', 'potato']]
累算代入演算子
累算代入演算子である+=
を使うと、extend() と同じように複数のリストをひとまとめにできる。
x = ['apple', 'banana']
y = ['tomato', 'potato']
x += y
x
# ['apple', 'banana', 'tomato', 'potato']
clear()
clear() は、全ての要素を削除する
fruits = ['apple', 'banana', 'cherry', 'lemon']
fruits.clear()
fruits
# []
count()
count()は、指定した要素がリストの中にいくつ含まれているか返す。
fruits = ['apple', 'banana', 'cherry', 'apple']
fruits.count('apple')
# 2
index()
要素のオフセットを知りたい場合は、index()を使う。
fruits = ['apple', 'banana', 'cherry']
fruits.index('banana')
# 1
in
リストの中に指定した要素が存在するか確かめたい場合、ブール値を返す in を使うとよい。
fruits = ['apple', 'banana', 'cherry']
'apple' in fruits
# True
sort()
sort()は元のリストをソートするメソッド。sort()によって元のリストは破壊的に変更される。
# sort()
x = [8, 2, 7, 6, 1]
print(x) # 元のリストも破壊的に変更された
# [1, 2, 6, 7, 8]
sort()自体は None を返す。
x = [4, 2, 1, 5, 3]
y = x.sort()
print(y) # None
print(x) # [1, 2, 3, 4, 5]
w = [3,5,1,7,9]
w.sort()
w
copy()
リストの copy()メソッドを使えば、リストの値を新しいリストにコピーできる。
a = [1, 2, 3]
b = a.copy()
print(b)
# [1, 2, 3]
他に list()を使ってコピーする方法もある。
a = [1, 2, 3]
b = list(a)
print(b)
# [1, 2, 3]
オフセットを使ってもコピーできる。
a = [1, 2, 3]
b = a[:]
print(b)
# [1, 2, 3]
上記で書いた、copy()、list()、オフセットのいずれも、書き換えではなく独立したコピーである。
max()
max()は数値の最大値を返す。
n = [1,2,3,4,5]
max(n)
# 5
sum()
sum()は、数値の合計を返す。
n = [1,2,3,4,5]
sum(n)
# 15