この記事では、Python における リスト の定義と、置換・削除・スライス・連結などのリストの基本操作について解説します。Python のリスト機能は柔軟性があって扱いやすく、データ分析や統計処理で頻繁に活用されます。
リストの定義と基本操作
Python のリストは複数要素(数値や文字などのデータ)にインデックスとよばれる見出し番号を割り当てて、ひとまとまりにしたもので、Python では
[要素0, 要素1, 要素2, 要素3, ...... ]
という形式で定義されます。インデックスは必ず 0 から始まります。1 個目の要素には 0 、10 個目の要素には 9 が割り振られます。
リストそれ自体も数値や文字列と同じように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)
# ['りんご', 'みかん', 'バナナ', 'チョコレート', 'チーズケーキ', 'アップルパイ']
リストの要素を削除します
リストから特定の要素を削除したいときは del 文を使います。
# PYTHON_LIST_DEL
# In[1]
# Pythonのパッケージのリスト
packages = ["NumPy", "SciPy", "SymPy"]
# リストの2番目の要素を削除
del packages[1]
print(packages)
# ['NumPy', 'SymPy']
スライスでリストから複数の要素を取り出します
Python のリストにはスライスというユニークな機能が備わっています。その名の通り、玉ねぎを包丁でスライスするような感覚で連続した要素をまとめて取り出すことができます。ただ、スライスという言葉は指定した要素をリストから削除するような誤解を与えてしまうかもしれません。しかし実際には取り出した要素をコピーして新しいリストを作るだけで、元のリストの中身が変わるわけではありません。リストをスライスしたいときは、
[最初のインデックス : 最後のインデックス + 1]
という形式で記述します。
# 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.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.clear()
list.clear() はリストの全要素を削除します。
# PYTHON_LIST_CLEAR
# In[1]
# 宮沢賢治の作品リスト
kenji = ["注文の多い料理店", "銀河鉄道の夜", "セロ弾きのゴーシュ"]
# リストの要素を全て削除
kenji.clear()
print(kenji)
# []
戻り値は空白のリスト [] となっています。
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
人工知能がPythonのリストについて対話形式で解説します
生徒1: 先生、Pythonのリストって何ですか?聞いたことはありますが、具体的にどういうものなのでしょうか?
先生: いい質問ですね!Pythonのリストは、複数の値をまとめて1つの変数に格納するためのデータ構造です。例えば、数値や文字列、その他のPythonオブジェクトなど、さまざまなデータ型をリストに含めることができます。
生徒2: なるほど、つまり複数の値をひとまとめにして扱えるってことですね?
先生: その通りです!リストは、個々の要素にアクセスすることができますし、要素の追加や削除、変更も行うことができます。また、リストは順序を持っているので、要素の順番も変更できます。
生徒1: すごい便利そうですね!どのようにリストを作成するのでしょうか?
先生: リストを作成するには、角括弧([ ])を使います。要素と要素の間はカンマ(,)で区切ります。例えば、次のように書くことで、整数のリストを作成できます。
- - - - - - - - - -
numbers = [1, 2, 3, 4, 5]
- - - - - - - - - -
生徒2: 分かりました!リストの要素にはどのようにアクセスすればいいですか?
先生: リストの要素には、インデックス(番号)を使ってアクセスします。Pythonでは、最初の要素のインデックスは0から始まります。例えば、numbersリストの最初の要素にアクセスするには、numbers[0]と書きます。
生徒1: インデックスを使って要素にアクセスすることができるんですね!でも、要素の追加や削除はどうやるんですか?
先生: 要素を追加するには、append()メソッドを使います。例えば、numbersリストに新しい要素を追加する場合は、次のようにします。
- - - - - - - - - -
numbers.append(6)
- - - - - - - - - -
生徒2: なるほど、append()メソッドを使って要素を追加するんですね!じゃあ、要素の削除はどうすればいいですか?
先生: 要素を削除するには、delキーワードを使います。削除したい要素のインデックスを指定して、delキーワードとともに使います。例えば、numbersリストの2番目の要素を削除する場合は、次のようにします。
- - - - - - - - - -
del numbers[1]
- - - - - - - - - -
生徒1: delキーワードを使って要素を削除するんですね!リストの要素の変更はできるんですか?
先生: はい、リストの要素は変更することができます。特定のインデックスの要素を別の値に変更するには、代入演算子(=)を使います。例えば、numbersリストの3番目の要素を変更する場合は、次のようにします。
- - - - - - - - - -
numbers[2] = 10
- - - - - - - - - -
生徒2: わかりました!リストは要素の追加や削除、変更ができるんですね。すごく便利そうです!
先生: そうですね、リストはPythonで非常に重要なデータ構造です。他にも、リストにはソートや結合など、さまざまな操作がありますが、今日はここまでにしましょう。リストの基本的な使い方を覚えて、自由に活用してみてくださいね!