Pythonのlistとは?基本操作から応用テクニックまで使い方を徹底解説!

Pythonを学び始めた方にとって、リストは初期段階で出会う壁の一つでしょう。「複数の値をまとめて扱えるもの」というざっくりとした理解はあっても、
- 実際にどのような特徴があり
- どんな操作ができるのか
- 他のデータ型との違いは何なのか
といった疑問を抱えている方は多いのではないでしょうか。
リストを使いこなせるようになれば、データの管理や処理が格段に楽になり、より効率的なプログラムが書けるようになります。本記事では、基本的な概念から実践的な使い方、さらには応用テクニックまで、Pythonリストについて分かりやすく解説していきます。
Python リストとは?基本概念を理解しよう

Pythonのリスト(list)は、「複数の要素を順序付きで格納できるデータ構造」です。数値や文字列、さらには他のリストまで、異なる種類のデータを一つのリストに混在させられる仕組みとなっています。
リストの最大の特徴は「可変性」にあり、一度作成した後でも、要素の追加や削除、変更が自由に行えるため、動的にデータを管理したい場面で重宝されます。また各要素にはインデックス番号が割り当てられており、0から始まる番号を使って特定の要素にアクセスできます。
なお、そもそものPythonの概要についてもっと詳しく知りたい方は、以下の記事をご覧ください。
「なんか今の仕事合わないな・・・」
「IT業界に転職してみたいなぁ・・・」
という方、DMMが運営する「WEBCAMP エンジニア転職」をご検討してみてはいかがですか?

「WEBCAMP エンジニア転職」では最短12週間でITエンジニアを目指すことが可能です!
WEBCAMPの卒業生は転職後に年収もUP!(例:年収250万円→500万円)
しかも今なら受講料の最大70%が給付金として支給されます。
DMM WEBCAMPは経済産業省・厚生労働省が認定した専門実践教育訓練給付金制度の対象です
リストの定義と特徴

Pythonのリストは角括弧[]で囲んで定義し、要素同士はカンマで区切ります。
[1, 2, 3]
['apple', 'banana', 'cherry']
リストには、主に以下のような特徴があります。
順序性 | 要素の順番が保たれ、同じ要素を複数含むことも可能 |
可変性 | 作成後も要素の追加・削除・変更が自由 |
異なるデータ型の混在 | 数値、文字列、ブール値などを一つのリストに格納可能 |
インデックスアクセス | 0から始まる番号で各要素にアクセス |
ネスト構造 | リストの中にリストを含められる |
リストと他のデータ型(タプル、セット、辞書)との違い
Pythonには複数の要素を格納できる他のデータ型も存在します。それぞれの違いを理解しておくことで、適切な場面で適切なデータ型を選択できるようになります。
タプル(tuple)との違いは、主に可変性です。タプルは一度作成すると要素の変更ができない「不変」のデータ構造であり、丸括弧()で定義し、変更が不要な固定データを扱う際に使用されます。
一方、セット(set)は重複を許さず、順序も保証されません。波括弧{}で定義し、集合演算(和集合、積集合など)を得意としており、重複排除や集合操作が主な用途となります。
そして辞書(dict)はキーと値のペアでデータを管理します。順序は保たれますが、インデックス番号ではなくキーを使ってアクセスするのが特徴で、データの関連付けや検索に優れています。
リストの作成方法

リストを作成する方法はいくつか存在します。ここでは、代表的な3つの方法を紹介していきます。
[]を使って空のリストを作成する
最もシンプルな方法は、角括弧だけを使って空のリストを作成することです。
empty_list = []
print(empty_list) # []
print(type(empty_list)) # <class 'list'>
空のリストは、「後から要素を追加していく場合の土台」として使用されます。初期状態では何も含まれていませんが、append()やinsert()などのメソッドで要素を追加できます。
要素を含んだリストを作成する
初期値として要素を含んだリストを作成する場合は、以下のように、角括弧の中に要素をカンマで区切って記述します。
numbers = [1, 2, 3, 4, 5]
fruits = ['apple', 'banana', 'orange']
mixed_list = [1, 'hello', True, 3.14]
nested_list = [[1, 2], [3, 4], [5, 6]]
このように、同じデータ型の要素だけでなく、異なるデータ型を混在させることも、リストの中にリストを含めることも可能です。
range()関数で数値のリストを作成する
連続する数値のリストが必要であれば、range()関数とlist()関数を組み合わせて作成できます。
# 0から9までの数値リスト
numbers1 = list(range(10))
print(numbers1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1から10までの数値リスト
numbers2 = list(range(1, 11))
print(numbers2) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 偶数のみのリスト(ステップを指定)
even_numbers = list(range(0, 11, 2))
print(even_numbers) # [0, 2, 4, 6, 8, 10]
range()関数は開始値、終了値、ステップを指定できるため、様々なパターンの数値リストを簡単に作成できます。
なお、こういった基礎を学べるPython講座のおすすめについては、以下の記事でも紹介していますので、ぜひ参考にしてください。
リストの基本操作

リストを効果的に活用するなら、基本的な操作方法を習得していきましょう。
ここでは、以下の基本操作について解説します。
- 要素の追加(append, insert, extend)
- 要素の削除(remove, pop, del)
- 要素の変更と取得
- リストの結合(+演算子, extend)
- 特定の要素が含まれているか確認する
要素の追加(append, insert, extend)
リストに新しい要素を追加する方法は複数あります。
まずappend()メソッドは最もよく使用される追加方法で、リストの末尾に要素を一つ追加します。
fruits = ['apple', 'banana']
fruits.append('orange')
print(fruits) # ['apple', 'banana', 'orange']
# リストを追加すると、リスト自体が一つの要素として追加される
fruits.append(['grape', 'melon'])
print(fruits) # ['apple', 'banana', 'orange', ['grape', 'melon']]
また、insert()メソッドは、指定した位置に要素を挿入します。既存の要素は後ろにずれます。
numbers = [1, 2, 4, 5]
numbers.insert(2, 3) # インデックス2の位置に3を挿入
print(numbers) # [1, 2, 3, 4, 5]
# 先頭に要素を追加
numbers.insert(0, 0)
print(numbers) # [0, 1, 2, 3, 4, 5]
extend()メソッドは、他のイテラブル(リストや文字列など)の全要素を、リストの末尾に追加します。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1) # [1, 2, 3, 4, 5, 6]
# 文字列を展開して追加
colors = ['red', 'blue']
colors.extend('green')
print(colors) # ['red', 'blue', 'g', 'r', 'e', 'e', 'n']
要素の削除(remove, pop, del)
リストから要素を削除するときは、削除したい要素の指定方法によってやり方を使い分けます。たとえばremove()メソッドは、指定した値と一致する最初の要素を削除します。
fruits = ['apple', 'banana', 'orange', 'banana']
fruits.remove('banana') # 最初のbananaのみ削除
print(fruits) # ['apple', 'orange', 'banana']
# 存在しない値を削除しようとするとエラー
# fruits.remove('grape') # ValueError: list.remove(x): x not in list
pop()メソッドは、指定したインデックスの要素を削除し、その値を返します。インデックスを省略すると末尾の要素が削除されます。
numbers = [1, 2, 3, 4, 5]
last_item = numbers.pop() # 末尾の要素を削除して取得
print(last_item) # 5
print(numbers) # [1, 2, 3, 4]
second_item = numbers.pop(1) # インデックス1の要素を削除
print(second_item) # 2
print(numbers) # [1, 3, 4]
del文は、インデックスやスライスを指定して要素を削除します。
colors = ['red', 'green', 'blue', 'yellow', 'purple']
del colors[1] # インデックス1の要素を削除
print(colors) # ['red', 'blue', 'yellow', 'purple']
del colors[1:3] # インデックス1から2までの要素を削除
print(colors) # ['red', 'purple']
要素の変更と取得
リストの要素は、インデックスを使って取得や変更ができます。負のインデックスを使用すると、末尾から数えてアクセスできます。
animals = ['cat', 'dog', 'bird', 'fish']
# 要素の取得
first_animal = animals[0]
print(first_animal) # cat
last_animal = animals[-1]
print(last_animal) # fish
# 要素の変更
animals[2] = 'hamster'
print(animals) # ['cat', 'dog', 'hamster', 'fish']
# 複数の要素を一度に変更
animals[1:3] = ['rabbit', 'turtle']
print(animals) # ['cat', 'rabbit', 'turtle', 'fish']
リストの結合(+演算子, extend)
複数のリストを結合する方法として、+演算子とextend()メソッドがあります。+演算子は新しいリストを作成して結合結果を返します。
元のリストは変更されません。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2
print(combined) # [1, 2, 3, 4, 5, 6]
print(list1) # [1, 2, 3] (変更されない)
また、extend()メソッドは既存のリストを変更します。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1) # [1, 2, 3, 4, 5, 6] (変更される)
特定の要素が含まれているか確認する
リストに特定の要素が含まれているかを確認するには、in演算子を使用します。
fruits = ['apple', 'banana', 'orange']
print('apple' in fruits) # True
print('grape' in fruits) # False
print('banana' not in fruits) # False
# 条件分岐と組み合わせて使用
if 'orange' in fruits:
print('オレンジがあります')
リストの便利な操作

基本操作を理解したら、より効率的にリストを操作できる便利な機能を習得しましょう。以下で紹介するテクニックを覚えることで、コードがより簡潔で読みやすくなります。
- リスト内包表記(リストを効率的に生成する)
- リストのスライス(一部を切り取る)
- リストのソート(並び替え)
- リストの要素を数える(count)
- リストの要素を検索する(index)
リスト内包表記(リストを効率的に生成する)
リスト内包表記は、既存のリストや範囲から新しいリストを効率的に作成する記法です。for文よりも簡潔で高速に処理できるのが特徴です。
# 基本的なリスト内包表記
numbers = [1, 2, 3, 4, 5]
squared = [x**2 for x in numbers]
print(squared) # [1, 4, 9, 16, 25]
# 条件を含むリスト内包表記
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers) # [0, 2, 4, 6, 8]
# 文字列操作と組み合わせ
words = ['hello', 'world', 'python']
upper_words = [word.upper() for word in words]
print(upper_words) # ['HELLO', 'WORLD', 'PYTHON']
# ネストしたリストの展開
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [item for row in matrix for item in row]
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
リストのスライス(一部を切り取る)
スライス記法を使用すると、リストの一部分を効率的に取得できます。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 基本的なスライス
print(numbers[2:7]) # [2, 3, 4, 5, 6]
print(numbers[:5]) # [0, 1, 2, 3, 4] (開始を省略)
print(numbers[5:]) # [5, 6, 7, 8, 9] (終了を省略)
# ステップを指定
print(numbers[::2]) # [0, 2, 4, 6, 8] (2つおき)
print(numbers[1::2]) # [1, 3, 5, 7, 9] (奇数のみ)
# 逆順
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# 負のインデックスとの組み合わせ
print(numbers[-3:]) # [7, 8, 9] (末尾3つ)
print(numbers[:-2]) # [0, 1, 2, 3, 4, 5, 6, 7] (末尾2つを除く)
リストのソート(並び替え)
リストの要素を並び替える方法として、sort()メソッドとsorted()関数があります。sort()メソッドは元のリストを変更します。
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
# 降順でソート
numbers.sort(reverse=True)
print(numbers) # [9, 6, 5, 4, 3, 2, 1, 1]
# 文字列のソート
fruits = ['banana', 'apple', 'cherry', 'date']
fruits.sort()
print(fruits) # ['apple', 'banana', 'cherry', 'date']
# 長さでソート
fruits.sort(key=len)
print(fruits) # ['date', 'apple', 'banana', 'cherry']
sorted()関数は新しいソート済みリストを返し、元のリストは変更しません。
original = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_list = sorted(original)
print(sorted_list) # [1, 1, 2, 3, 4, 5, 6, 9]
print(original) # [3, 1, 4, 1, 5, 9, 2, 6] (変更されない)
リストの要素を数える(count)
count()メソッドを使用すると、指定した値がリストに何回出現するかを数えられます。
numbers = [1, 2, 3, 2, 1, 2, 4, 2]
count_2 = numbers.count(2)
print(count_2) # 4
letters = ['a', 'b', 'c', 'a', 'b', 'a']
count_a = letters.count('a')
print(count_a) # 3
# 存在しない要素を数える
count_z = letters.count('z')
print(count_z) # 0
リストの要素を検索する(index)
index()メソッドは、指定した値が最初に現れるインデックスを返します。
fruits = ['apple', 'banana', 'orange', 'banana']
banana_index = fruits.index('banana')
print(banana_index) # 1 (最初のbananaのインデックス)
# 検索範囲を指定
second_banana = fruits.index('banana', 2)
print(second_banana) # 3
# 存在しない要素を検索するとエラー
# grape_index = fruits.index('grape') # ValueError: 'grape' is not in list
# エラーを回避する方法
if 'grape' in fruits:
grape_index = fruits.index('grape')
else:
print('grape is not in the list')
なお、ここまで紹介したような基礎や便利操作を体系的に学びたい方は、ぜひDMM WEBCAMPのPythonコースをご検討ください。完全初心者でも安心して始められるカリキュラムでありながら、確実に実務で確実に役立つ内容を、徹底したサポートつきで学べます。
>>DMM WEBCAMP Pythonコースの詳細はこちら
よくある質問とエラー解決

ここでは、Pythonリストを使用する際によく遭遇するエラーやその他疑問について、解決方法を説明します。
「list index out of range」エラーの対処法
こちらは「存在しないインデックスにアクセスしようとした際」によく発生します。たとえば、以下のようなプログラムで解説します。
fruits = ['apple', 'banana', 'orange']
print(fruits[3]) # エラー!
fruits の長さは3(インデックスは 0,1,2)なのに、[3] を指定しているためエラーになります。対処法のひとつは、インデックスがリストの範囲内か確認することです。
if index < len(fruits):
print(fruits[index])
else:
print("その位置には要素がありません")
またfor文で確認する方法もあります。
リストを順に処理したいなら、インデックス指定ではなく繰り返し処理を使う方が安全です。
for fruit in fruits:
print(fruit)
さらにもうひとつの方法として、「try-exceptで例外処理する」ことも挙げられます。
try:
print(fruits[index])
except IndexError:
print("インデックスが範囲外です")
デバッグ時に確認するべきポイントとしては以下です。
- len(list) → リストの長さをチェック
- 実際にアクセスしている index の値を print で確認
- ループの終了条件が正しいか確認
ループの終了条件については、
range(len(list))
と書くべきところを
range(len(list)+1)
にしているケースもよくあるので、注意しましょう。
リストのコピー方法(参照渡しと値渡し)
Pythonでは、リストの代入時に注意が必要です。単純な代入では参照がコピーされるため、一方を変更すると他方にも影響します。
# 参照のコピー(浅いコピー)
original = [1, 2, 3]
reference = original
reference.append(4)
print(original) # [1, 2, 3, 4] (元のリストも変更される)
# 値のコピー方法 1: copy()メソッド
original = [1, 2, 3]
copy1 = original.copy()
copy1.append(4)
print(original) # [1, 2, 3] (元のリストは変更されない)
print(copy1) # [1, 2, 3, 4]
# 値のコピー方法 2: スライス
copy2 = original[:]
copy2.append(5)
print(original) # [1, 2, 3] (変更されない)
# 値のコピー方法 3: list()関数
copy3 = list(original)
# ネストしたリストの完全なコピー(深いコピー)
import copy
nested_list = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(nested_list)
deep_copy[0].append(3)
print(nested_list) # [[1, 2], [3, 4]] (変更されない)
print(deep_copy) # [[1, 2, 3], [3, 4]]
複数条件でのリスト操作方法
複数の条件を組み合わせたリスト操作は、論理演算子やリスト内包表記を活用して実現できます。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# AND条件:偶数かつ5より大きい
result1 = [x for x in numbers if x % 2 == 0 and x > 5]
print(result1) # [6, 8, 10]
# OR条件:3の倍数または7より大きい
result2 = [x for x in numbers if x % 3 == 0 or x > 7]
print(result2) # [3, 6, 8, 9, 10]
# 複雑な条件:範囲指定と除外条件
result3 = [x for x in numbers if 3 <= x <= 8 and x != 5]
print(result3) # [3, 4, 6, 7, 8]
# 関数を使った条件分岐
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
primes = [x for x in numbers if is_prime(x)]
print(primes) # [2, 3, 5, 7]
Pythonを学ぶならDMM WEBCAMP

本記事で紹介したような、Pythonのリスト操作を含む体系的なプログラミングスキルを身に付けたいとお考えでしたら、DMM WEBCAMPのPythonコースがおすすめです。
こちらはPythonの基礎から実践的なアプリケーション開発まで、段階的に学習できるカリキュラムが用意されており、リストのような基本的なデータ構造の理解から始まり、Webアプリケーション開発やデータ分析といった実際の業務で活用できるスキルまで習得可能です。
また、実際の開発現場でよく使われる手法やチーム開発なども体験できるため、学習した内容をすぐに実務で活かせます。Pythonエンジニアとしての就職や転職を目指している方には、うってつけの心強いサポート体制が用意されているので、ぜひこの機会にご検討ください。
>>DMM WEBCAMP Pythonコースの詳細はこちら
まとめ
Pythonのリストは、プログラミングにおいて欠かせない重要なデータ構造です。基本的な作成方法から要素の追加・削除・変更といった基本操作、さらにはリスト内包表記やスライスなどの応用テクニックまで、幅広い機能が提供されています。
本記事で紹介した内容は、Pythonプログラミングの基礎となる重要な知識ばかりです。独学で学習を進めることも可能ですが、体系的なカリキュラムと専門講師のサポートがあれば、より効率的にスキルを身に付けられます。
DMM WEBCAMPのPythonコースなら、リスト操作をはじめとした基礎知識から実践的な開発スキルまで、段階的に学習できる環境が整っていますので、ぜひご検討ください。