『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

リストの抽出・スライス・連結・削除・置換

この記事では、Pythonにおけるリストの定義と、置換・削除・スライス・連結などのリストの基本操作について解説します。Python のリスト機能は柔軟性があって扱いやすく、データ分析や統計処理で頻繁に活用されます。

【Python】リストの基本操作

Python のリストは複数要素(数値や文字などのデータ)にインデックスとよばれる見出し番号を割り当てて、ひとまとまりにしたもので、Python では

[要素0, 要素1, 要素2, 要素3, ... ]

という形式で定義されます。インデックスは必ず 0 から始まります。1 個目の要素には 0 、5 個目の要素には 4 が割り振られます。
 
Python リストとインデックス
リストそれ自体も数値や文字列と同じように1つのデータ型として扱われます。フルーツのリストを作って、type() 関数でデータ型を調べてみましょう。

# PYTHON_LIST

# In[1]

# フルーツのリスト
fruits = ["りんご", "みかん", "バナナ"]

# fruitsのクラスを取得
x = type(fruits)

print(x)
# <class 'list'>

次のコードでリストを表示させてみましょう。

# In[2]

print(fruits)
# ['りんご', 'みかん', 'バナナ']

リストから要素を抽出する

リストから特定要素を抜き出すときは、

リスト名[要素番号]

と記述します。1つめの要素にはインデックス 0 が割り当てられているので、リストから1つめの要素を取り出すときは、

リスト名[0]

と記述します。

# In[3]

# リストの1番目の要素の取り出し
print(fruits[0])
# りんご

リストの要素を置換する

リストの特定の要素を別の要素に置き換えることもできます。

リスト名[インデックス] = 新しい要素

お菓子のリストを作って、2 番目の要素を置き換えてみます:

# PYTHON_LIST_REPLACE

# In[1]

# お菓子のリスト
sweets = ["チョコレート", "チーズケーキ", "アップルパイ"]

# リストの2番目の要素"チーズケーキ"を"抹茶プリン"に置き換える
sweets[1] = "抹茶プリン"

print(sweets)
# ['チョコレート', '抹茶プリン', 'アップルパイ']

2 番目の要素が ‘抹茶プリン’ に置き換わりました。

リストを連結する

算術演算子「+」を使うと、2 種類のリストを連結することができます。

# PYTHON_LIST_JOIN

# In[1]

# フルーツのリスト
fruits = ["りんご", "みかん", "バナナ"]

# お菓子のリスト
sweets = ["チョコレート", "チーズケーキ", "アップルパイ"]

# リストを連結
fruits_and_sweets = fruits + sweets

print(fruits_and_sweets)
# ['りんご', 'みかん', 'バナナ', 'チョコレート', 'チーズケーキ', 'アップルパイ']

リストの積

乗算演算子「*」を使って、同一要素を複数個格納したリストを生成できます。たとえば、0 を 5 個並べたリストをリストを生成する場合は以下のように書きます。

# PYTHON_LIST_PRODUCT

# In[1]

# 0を5個並べたリストを生成
zeros = [0] * 5

print(zeros)  # [0, 0, 0, 0, 0]

リストの一部分だけ同じ要素が繰り返される場合にも、加算演算子「+」と組み合わせて簡潔に記述できます。

# In[2]

numbers = [0] * 5 + [1] *3

print(numbers)  # [0, 0, 0, 0, 0, 1, 1, 1]

リストの要素を削除する

リストから特定の要素を削除したいときは del 文を使います。

# PYTHON_LIST_DEL

# In[1]

# Pythonのパッケージのリスト
packages = ["NumPy", "SciPy", "SymPy"]

# リストの2番目の要素を削除
del packages[1]

print(packages)
# ['NumPy', 'SymPy']

リストの要素のスライス

Python のリストにはスライス(スライシング)というユニークな機能が備わっています。その名の通り、玉ねぎを包丁でスライスするような感覚で連続した要素をまとめて取り出すことができます。ただ、スライスという言葉は指定した要素をリストから削除するような誤解を与えてしまうかもしれません。しかし実際には取り出した要素をコピーして新しいリストを作るだけで、元のリストの中身が変わるわけではありません。リストをスライスしたいときは、

[最初のインデックス : 最後のインデックス + 1]

という形式で記述します。
 
Python リストのスライス

# PYTHON_LIST_SLICING

# In[1]

# 猫の品種リスト
cats = ["マンチカン", "メインクーン", "アビシニアン", "ベンガル", "ヒマラヤン"]

# リストの2番目から4番目の要素を抽出
cats_2 = cats[1:4]

print(cats_2)
# ['メインクーン', 'アビシニアン', 'ベンガル']

スライスするときにコロン (:) の左右は省略することができます。右側を省略すると指定したインデックスから最後までの要素を全部取り出します。左側を省略すると最初の要素から、インデックスまでの要素を取り出します。

# In[2]

# 3番目以降のすべての要素を取り出す
cats_3 = cats[2:]

# 最初から2つめまでの要素を取り出す
cats_4 = cats[:2]

print(cats_3)
print(cats_4)
# ['メインクーン', 'アビシニアン', 'ベンガル']
# ['マンチカン', 'メインクーン']

リストのメソッド一覧

リストオブジェクトに備わる主なメソッドについて解説します。

list.append()

 list.append(x) はリストの末尾にオブジェクト x を付け加えます。mylist.append(x) は参照代入 mylist[len(mylist):] = [x] と同じ操作です。

# PYTHON_LIST_APPEND

# In[1]

# リストを定義
animals = ["キリン", "カバ"]

# リストの末尾に"シマウマ"を追加
animals.append("シマウマ")

print(animals)
# ['キリン', 'カバ', 'シマウマ']

ただし、追加できるオブジェクトは1つです。
複数の文字列を追加しようとすると TypeError を送出します。

# In[2]

animals.append("サイ", "ゾウ")
# TypeError: append() takes exactly one argument (2 given)

複数要素をもつリストは1つのオブジェクトなので末尾に追加することはできます。しかし、その場合はリストの入れ子になります。

# In[3]

# リストの末尾にリストを追加
animals.append(["サイ", "ゾウ"])

print(animals)
# ['キリン', 'カバ', 'シマウマ', ['サイ', 'ゾウ']]

複数要素をまとめて追加したいときは、後述する list.extend() を使ってください。

list.extend()

list.extend() はリストの末尾にイテラブルオブジェクトの要素を追加して、リストを拡張します。

# PYTHON_LIST_EXTEND

# In[1]

# リストを定義
animals = ["ライオン", "トラ"]

# リストの末尾に複数要素を追加
animals.extend(["ヒョウ", "チーター"])

print(animals)
# ['ライオン', 'トラ', 'ヒョウ', 'チーター']

list.append() はオブジェクトそのものを追加するメソッドでしたが、list.extend() はオブジェクトの「中身」を追加します。したがって、タプルを渡しても同じ結果が得られます。

# In[2]

# リストを定義
animals = ["ライオン", "トラ"]

# リストの末尾に複数要素を追加
animals.extend(("ヒョウ", "チーター"))

print(animals)
# ['ライオン', 'トラ', 'ヒョウ', 'チーター']

list.insert()

list.insert(i,x) はインデックス i の位置に1つのオブジェクト x を挿入します。メソッド適用以前にインデックス i の位置にあった要素は i + 1 の位置に移動します。

# PYTHON_LIST_INSERT

# In[1]

# リストを定義
animals = ["コアラ", "カンガルー", "クスクス"]

# インデックス1の位置に文字列を挿入
animals.insert(1, "ウォンバット")

print(animals)
# ['コアラ', 'ウォンバット', 'カンガルー', 'クスクス']

list.append() と同様に、挿入できるのは単独オブジェクトであり、複数の文字列を渡すことはできません。

list.clear()

list.clear() はリストの全ての要素を削除します。

# Python List Clear

# In[1]

# 文字列をリストに変換して['a', 'b', 'c']を生成
my_list = list("abc")

# リストの全要素を削除
# (破壊メソッドであることに注意!)
my_list.clear()
# === del my_list[:]
# === my_list[:] = []

print(my_list)  # []

list.pop()

list.pop() はリストから要素を1つ削除して、削除した要素を返すメソッドです。
引数を省略するとリストの末尾の要素を削除します。

# PYTHON_LIST_POP

# In[1]

# 川端康成の作品リスト
kawabata = ["雪国", "古都", "伊豆の踊り子", "山の音", "たんぽぽ"]

# リストの末尾の要素を削除
print(kawabata.pop())

print(kawabata)
# たんぽぽ
# ['雪国', '古都', '伊豆の踊り子', '山の音']

list.pop() に整数を渡すと、対応するインデックスの要素を返します。

# In[2]

# 川端康成の作品リスト
kawabata = ["雪国", "古都", "伊豆の踊り子", "山の音", "たんぽぽ"]

# 3番目(インデックス2)の要素を削除
print(kawabata.pop(2))

print(kawabata)
# 伊豆の踊り子
# ['雪国', '古都', '山の音', 'たんぽぽ']

 

list.remove()

list.remove(x) は x に等しい最初の要素を削除します。

# PYTHON_LIST_REMOVE

# In[1]

# 夏目漱石の作品リスト
soseki = ["三四郎", "こころ", "坊ちゃん", "道草", "夢十夜"]

# "道草"を削除
soseki.remove("道草")

print(soseki)
# ['三四郎', 'こころ', '坊ちゃん', '夢十夜']

x に該当する要素がリストになければ、ValuError が発生します。

# In[2]

# 夏目漱石の作品リスト
soseki = ["三四郎", "こころ", "坊ちゃん", "道草", "夢十夜"]

# "倫敦塔"を削除
soseki.remove("倫敦塔")

# ValueError: list.remove(x): x not in list

list.copy()

list.copy() はリストの浅いコピー (shallow copy) を返します。

# PYTHON_LIST_COPY

# In[1]

# リストを作成
egg = ["オムレツ", "目玉焼き", "スクランブルエッグ"]

# リストのコピー
x = egg.copy()

print(x)
# ['オムレツ', '目玉焼き', 'スクランブルエッグ']

list.index()

list.index(x, [start, [end]]) は第 1 引数で指定した値に一致する最初の要素のインデックスを返します。

# PYTHON_LIST_INDEX

# In[1]

# リストを作成
tofu = ["湯豆腐", "揚げ豆腐", "麻婆豆腐", "肉豆腐"]

# 指定要素のインデックスを取得
idx = tofu.index("揚げ豆腐")

print(idx)
# 1

オプション引数 start, end で探索範囲を指定できます。
戻り値はリストの先頭からの位置です。

# In[2]

# リストを作成
num = [1, 0, 6, 8, 0, 2, 5, 9, 3, 0]

# インデックス3~9の範囲で0を探す
x = num.index(0, 3, 9)

print(x)
# 4

コード INDEX-2 の例では、インデックス 3 ~ 9 の範囲に 0 が 2 つありますが、インデックスの小さいほうの 4 の位置を返します。 

list.count()

list.count(x) は x に一致する要素の数を返します。

# PYTHON_LIST_COUNT

# In[1]

# リストを作成
num = [2, 0, 1, 1, 8, 1, 9, 3, 6, 1, 7, 1, 5]

# リストに含まれる1の個数を数える
x = num.count(1)

print(x)
# 5

リストの要素の並べ替えについては別記事で解説しています。

組み込み関数によるリストの操作

Python には外部から import しなくても使える組み込み関数が用意されています。この章では組み込み関数を使ってリストの合計値や最大値・最小値・長さを求める方法を解説します。

リストの合計値

リストの要素を合計するときは sum()関数 を使います。

# PYTHON_LIST_SUM

# In[1]

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# リストの合計値
x = sum(etest)

print(x)
# 367

リストの最大値

max() はリストから最大要素を返します。

# PYTHON_LIST_MAX

# In[1]

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# リストの最大値
x = max(etest)

print(x)
# 90

リストの最小値

min() はリストから最小要素を返します。

# PYTHON_LIST_MIN

# In[1]

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# リストの最小値
x = min(etest)

print(x)
# 58

リストの長さ

len() はリストの長さ、すなわち要素の個数を返します。

# PYTHON_LIST_LEN

# In[1]

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# リストの長さ(要素の個数)
x = len(etest)

print(x)
# 5

リストの平均値

sum() と len() を組合わせると、リストの平均値を計算することができます。

# PYTHON_LIST_AVERAGE

# In[1]

# 英語の試験の点数
etest = [71, 58, 90, 83, 65]

# 平均点を計算
mean_etest = sum(etest)/len(etest)

print(mean_etest)
# 73.4

コメント