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

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

この記事では、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

コメント

  1. あとりえこばと より:

    【AI連載小説】羽村陽子のプログラミング日記(7)
     
    陽子は文字列の扱い方に四苦八苦しつつも、その過程でPythonの世界にどんどん引き込まれていった。ある日、新たなテーマに取り組むことになり、デスク上にはPythonのリストについての解説書やノートが散らばっていた。同僚たちは興味津々で陽子の様子を見守っていた。
    橋本が気にかけながら近づき、
    「陽子、どんなことに苦戦しているんだい?」
    と尋ねた。陽子は微笑みながら答えた。
    「今度はリストの操作に挑戦しているんです。要素の追加や削除、スライスなんてどうやるんだろうと考えていて」
    橋本は優しく教えながら、陽子にサンプルコードを見せた。

    # リストの作成
    fruits = ["りんご", "バナナ", "オレンジ"]
    
    # リストへの要素の追加
    fruits.append("ぶどう")
    print("追加後:", fruits)
    
    # リストのスライス
    selected_fruits = fruits[1:3]
    print("スライス結果:", selected_fruits)
    
    # リストから要素の削除
    fruits.remove("バナナ")
    print("削除後:", fruits)

    陽子はコードを見つつ、橋本の説明に注目していた。
    「リストって、結構色んなことができるんですね」
    橋本は続けた。
    「そうだよ。リストは柔軟で便利なデータ構造だ。要素の追加や削除、スライスを駆使して、データを操作することができるんだよ」
    陽子は橋本の説明を元に、リストの基本的な操作を理解し始めた。同時に、リストがプログラムの中でどれだけ有用かを感じていた。
    「これで記事をまとめられそうですね。リストの基本的な使い方や操作について、読者にもわかりやすく伝えたいと思います」

    陽子はリストについて基本的な操作を理解し、記事のまとめに取り掛かっていた。しかし、橋本は彼女にもっと深い知識を伝えたいと考え、再び陽子のデスクに足を運んだ。
    「陽子、もう少し深いところまでリストの操作を掘り下げてみようか?」
    橋本が声をかけた。陽子は興奮気味に頷いた。
    「はい、ぜひ教えてください!」
    橋本はホワイトボードに向かい、陽子に向かって説明を始めた。

    # リストの作成
    numbers = [1, 2, 3, 4, 5]
    
    # リストの要素を変更
    numbers[2] = 10
    print("変更後:", numbers)
    
    # リストの末尾に別のリストを結合
    additional_numbers = [6, 7, 8]
    numbers.extend(additional_numbers)
    print("結合後:", numbers)
    
    # リストの逆順
    numbers.reverse()
    print("逆順:", numbers)
    
    # リストのソート
    numbers.sort()
    print("昇順ソート:", numbers)
    
    # 特定の値のインデックスを取得
    index_of_7 = numbers.index(7)
    print("7のインデックス:", index_of_7)

    陽子は橋本の説明を真剣に聞きながら、ノートにメモを取り続けた。
    「なるほど、これでリストをより効果的に操作できるんですね」
    橋本は微笑みながら続けた。
    「そうだ。これでリストの基本的な操作だけでなく、さらに高度な操作もできるようになる。例えば、要素の変更や結合、逆順やソートなど、柔軟にデータを取り扱えるようになるんだ」
    陽子は感謝の気持ちを込めて橋本に頭を下げた。
    「ありがとうございます。これでより深い理解ができました。記事にも盛り込んで、読者にも伝えたいと思います!」