PR

【Python】リスト(配列)の基本を3分でわかりやすく解説

Python

リストとは、Pythonプログラミング言語の中で一連の値やアイテムを格納するためのコンテナとして使われるデータ型の一つです。リストは順序が保持され、アイテムはインデックスによって参照されるという特徴を持ちます。

Python リスト
図1:リストのイメージ

参考 Pythonの特徴

このページではPython初心者向けにリスト(配列)の基本と使い方を1からわかりやすく解説します。

このページで学べる内容
  • リスト(配列)とは?
  • リストの特徴
    • 定義とアクセス
    • 可変性
  • リスト操作のメソッド
  • スライシング

Pythonエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。

参考 Pythonの基本的な書き方・構文ルール

スポンサーリンク

Python:リストとは?

Pythonのリストは、順序を持つ可変のデータ型で、さまざまな種類のデータを格納することができます。各データ項目は一意のインデックスによって参照され、整数型で0から始まります。

数字はインデックス

Pythonの変数が複数セットになったようなものと考えればOK。

変数が横並びに整列し、インデックスで順序通りに並んでいるイメージが持てると良いでしょう。

参考 Pythonの変数の基本

Python:リストの定義とアクセス

Pythonのリストは、角括弧([])の間にカンマ(,)で区切られた値を記述することで作成します。

リストは任意のデータ型の値を格納することができます。数値、文字列、他のリスト、さらには異なるデータ型の混在も許容されます。

以下にリストの生成例をいくつか示します。

# 数値のリスト
numbers = [1, 2, 3, 4, 5]

# 文字列のリスト
fruits = ['apple', 'banana', 'cherry', 'date']

# 異なるデータ型の混在
mixed = [1, 'two', 3.0, ['a', 'b', 'c']]

# 空のリスト
empty = []

リストの各要素には、0から始まるインデックスが割り当てられます。インデックスを用いてリストの要素にアクセスすることができます。

fruits = ['apple', 'banana', 'cherry']
print(fruits[0])  # 'apple'が出力されます
print(fruits[1])  # 'banana'が出力されます
print(fruits[2])  # 'cherry'が出力されます

参考 print関数

Pythonでは、リストの末尾から要素にアクセスするための負のインデックスもサポートされているため、以下のようにマイナス値を利用して要素を特定することも可能です。

fruits = ['apple', 'banana', 'cherry']
print(fruits[-1])  # 'cherry'が出力されます
print(fruits[-2])  # 'banana'が出力されます
print(fruits[-3])  # 'apple'が出力されます

要素が数個程度のリストであればこの利用方法はあまりおすすめしませんが、例えば要素が数十個あるような場合だと「後ろから数えたほうが早い(分かりやすい)」というようなシーンがあるため、頭に入れておくと便利です。

ちなみに、リストが格納している要素の範囲を超えるインデックスを指定すると、Pythonはエラーを出すため注意が必要です。

fruits = ['apple', 'banana', 'cherry']
print(fruits[3])  # IndexErrorが発生します。リストのインデックスは0から2までです。

まずは、これらの基本をマスターしましょう。

Python:リストの可変性(Mutable)

Pythonのリストは可変性(Mutable)を持つと言います。これは、リストが一度生成された後もその内容を変更できるという特性を指します。つまり、一度定義したリストの要素を後から追加、削除、変更することができるということです。

以下にリストの要素を追加・変更・削除するサンプルコードを記載しました。

サンプル1 リストの要素の変更

fruits = ['apple', 'banana', 'cherry']
fruits[1] = 'blueberry'  # 2番目の要素(インデックス1)を変更します
print(fruits)  # ['apple', 'blueberry', 'cherry']が出力されます

特定のインデックス位置にある要素を変更するには、そのインデックス位置に新しい値を代入します。

この操作により、'banana'が'blueberry'に置き換えられます。

サンプル2 リストへの要素の追加

fruits = ['apple', 'blueberry', 'cherry']
fruits.append('date')  # リストの末尾に新しい要素を追加します
print(fruits)  # ['apple', 'blueberry', 'cherry', 'date']が出力されます

リストに新しい要素を追加するには、append()メソッドを使用します。append()メソッドは新しい要素をリストの末尾に追加します。

リストの組み込みメソッドについては次の章で詳しく解説します。

サンプル3 リストから要素の削除

fruits = ['apple', 'blueberry', 'cherry', 'date']
fruits.remove('blueberry')  # 'blueberry'と一致する要素をリストから削除します
print(fruits)  # ['apple', 'cherry', 'date']が出力されます

リストから要素を削除するには、remove()メソッドを使用します。remove()メソッドは指定した値と一致する最初の要素をリストから削除します。

これらの操作により、Pythonのリストは動的にサイズを変更したり、要素を自由に編集したりすることが可能です。この可変性は、リストを非常に柔軟なデータ構造にしています。

Python:リストの操作メソッド

Pythonのリストには多くの組み込みメソッドがあり、これらをうまく活用することでリストに対する様々な操作を行うことが可能になります。

以下に主要なメソッドをいくつか紹介します。

append:リストの末尾に新しい要素を追加

append()メソッドはリストで使用できる組み込みの関数で、リストの末尾に新しい要素を追加することができます。

# 空のリストを作成します。
my_list = []

# appendメソッドを使って要素を追加します。
my_list.append('Apple')
my_list.append('Banana')
my_list.append('Cherry')

# リストを表示します。
print(my_list)
# Output: ['Apple', 'Banana', 'Cherry']

この例では、最初に空のリストを作成し、その後append()メソッドを使用して3つのフルーツ(Apple、Banana、Cherry)をリストに追加しています。

append()メソッドは、リストをスタックとして使用したい場合(すなわち、後入れ先出し(LIFO)のデータ構造を作りたい場合)に特に役立ちます。新しい要素は常にリストの末尾に追加されるため、最後に追加された要素が最初に取り出されることになります。

extend:リストの末尾に別のリストの要素を追加

extend()メソッドはリストの末尾に別のリスト(または任意のイテラブル)の要素を追加することです。

イメージはリストにリストを追加するようなイメージ。以下のサンプルコードをご覧下さい。

# リストを作成します。
fruits = ['apple', 'banana', 'cherry']

# 別のリストを作成します。
more_fruits = ['date', 'elderberry']

# extendメソッドを使ってfruitsリストにmore_fruitsリストの要素を追加します。
fruits.extend(more_fruits)

# リストを表示します。
print(fruits)
# Output: ['apple', 'banana', 'cherry', 'date', 'elderberry']

この例では、最初にfruitsリストを作成し、次にmore_fruitsリストを作成しています。その後、extend()メソッドを使用してfruitsリストにmore_fruitsリストの要素を追加。その結果、fruitsリストは元の3つの要素に加えて、more_fruitsリストの2つの要素を含むようになるということ。

extend()メソッドは、2つのリストを連結したい場合に特に便利です。

リストの+演算子を使用しても同様の結果を得ることができますが、extend()メソッドは元のリストを直接変更(ミューテート)するため、大きなリストを扱っていて新しいリストを作成するとメモリを大量に消費する可能性がある場合にはextend()メソッドの方が効率的。

また、extend()メソッドはリストだけでなく、任意のイテラブル(タプル、セット、文字列など)を引数として受け取ることができます。ただし、文字列を引数として使用すると、文字列の各文字が個別の要素としてリストに追加されることに注意してください。

insert:指定した位置に新しい要素を挿入

insert()メソッドを利用することで、特定の位置に新しい要素を挿入することができます。このメソッドは2つの引数を取ります。

2つの引数には、①挿入したい位置のインデックスと、②挿入したい要素を指定します。

# リストを作成します。
fruits = ['apple', 'banana', 'cherry']

# insertメソッドを使って'banana'と'cherry'の間に'blueberry'を挿入します。
fruits.insert(2, 'blueberry')

# リストを表示します。
print(fruits)
# Output: ['apple', 'banana', 'blueberry', 'cherry']

この例では、最初にfruitsリストを作成し、次にinsert()メソッドを使用して'banana'と'cherry'の間に新しいフルーツの'blueberry'を挿入しています。指定したインデックスは挿入したい位置を指しており、元の要素はその位置から右にシフトされます。

insert()メソッドは、リストの特定の位置に新しい要素を挿入したい場合に便利ですが、リストの先頭または中間に頻繁に要素を挿入すると、リストの他の要素をシフトする必要があり、大きなリストではコストがかかる操作となるため注意が必要です。

remove:指定した要素をリストから削除

remove()メソッドは指定した要素をリストから削除することができます。このメソッドは引数として削除したい要素の値を取ります。

指定された値がリスト内に複数存在する場合、remove()メソッドは最初に見つかった値のみを削除します。

# リストを作成します。
fruits = ['apple', 'banana', 'cherry', 'banana']

# removeメソッドを使って'banana'を削除します。
fruits.remove('banana')

# リストを表示します。
print(fruits)
# Output: ['apple', 'cherry', 'banana']

この例では、最初にfruitsリストを作成し、次にremove()メソッドを使用して最初の'banana'を削除しています。

remove()メソッドは、リストから特定の値を削除したい場合に便利ですが、remove()メソッドは削除したい値がリストに存在することを前提としています。削除したい値がリストに存在しない場合、remove()メソッドはValueErrorを発生するため注意が必要です。

したがって、remove()メソッドを使用する前に、削除したい値がリストに存在することを確認するか、try/exceptブロックを使用してValueErrorを処理することが重要です。

参考 try/exceptブロック

pop:指定した位置の要素をリストから取り出す

pop()メソッドは、リストから指定したインデックスの要素を削除しその要素を返します。

このメソッドはオプションでインデックスを引数として取りますが、引数が指定されない場合、リストの最後の要素を削除し返します。

# リストを作成します。
fruits = ['apple', 'banana', 'cherry']

# popメソッドを使って最後の要素を削除し、それを表示します。
popped_fruit = fruits.pop()

# 削除したフルーツを表示します。
print(popped_fruit)
# Output: 'cherry'

# 現在のリストを表示します。
print(fruits)
# Output: ['apple', 'banana']

この例では、最初にfruitsリストを作成し、次にpop()メソッドを使用してリストから最後の要素を削除し、その削除した要素を表示しています。pop()メソッドの呼び出し後のリストには、削除した要素は含まれていません。

pop()メソッドは、リストから要素を削除しつつその要素を取得したい場合に特に便利です。特定のインデックスの要素を削除したい場合、そのインデックスをpop()メソッドの引数として指定することが可能です。例えば、fruits.pop(0)はリストの最初の要素を削除し返します。

pop()メソッドを空のリストで呼び出すとIndexErrorが発生するため注意が必要です。

clear:リストからすべての要素を削除

clear()メソッドはリストからすべての要素を削除し、空のリストにします。

このメソッドは引数を取らず、リスト内の全要素を削除します。

# リストを作成します。
fruits = ['apple', 'banana', 'cherry']

# clearメソッドを使ってリストから全要素を削除します。
fruits.clear()

# リストを表示します。
print(fruits)
# Output: []

clear()メソッドを使用してfruitsリストからすべての要素を削除しています。clear()メソッドの呼び出し後のリストは空です。

index:指定した要素のインデックスを返す

index()メソッドは指定した要素がリスト内で最初に見つかった位置(インデックス)を返します。

このメソッドは引数として検索したい要素の値を取ります。また、オプションで検索を開始するインデックスと終了するインデックスを指定することもできます。

# リストを作成します。
fruits = ['apple', 'banana', 'cherry', 'banana']

# indexメソッドを使って'banana'の位置を検索します。
banana_index = fruits.index('banana')

# 'banana'の位置を表示します。
print(banana_index)
# Output: 1

index()メソッドを使用して最初の'banana'のインデックスを検索しています。

index()メソッドは検索したい値がリストに存在しない場合、index()メソッドはValueErrorを発生させます。したがって、index()メソッドを使用する前に、検索したい値がリストに存在することを確認するか、try/exceptブロックを使用してValueErrorを処理することが重要です。

ちなみに、index()メソッドは検索を開始するインデックスと終了するインデックスをオプションで指定できます。たとえば、fruits.index('banana', 2)はインデックス2以降で最初に見つかった'banana'のインデックスを返します。

count:指定した要素の数をリスト内でカウント

count()メソッドはリスト内の特定の要素の数を返します

このメソッドは引数として数えたい要素の値を指定します。

# リストを作成します。
fruits = ['apple', 'banana', 'cherry', 'banana']

# countメソッドを使って'banana'の数を数えます。
banana_count = fruits.count('banana')

# 'banana'の数を表示します。
print(banana_count)
# Output: 2

count()メソッドは、リストから特定の値の出現回数を数えたい場合に便利。

引数として与えられた値がリストに存在しない場合でも、count()メソッドは0を返すので、その値がリストに存在するかどうかを事前に確認する必要はありません。

sort:要素を昇順にソート

sort()メソッドはリスト内の要素をソート(並べ替え)します。

デフォルトでは、このメソッドはリストを昇順(小さい順)にソートします。また、オプションで逆順(大きい順)にソートすることもできます。

# リストを作成します。
numbers = [5, 1, 9, 3, 7]

# sortメソッドを使ってリストをソートします。
numbers.sort()

# ソート後のリストを表示します。
print(numbers)
# Output: [1, 3, 5, 7, 9]

逆順にソートするには、sort()メソッドの引数としてreverse=Trueを指定します。

# リストを作成します。
numbers = [5, 1, 9, 3, 7]

# sortメソッドを使ってリストを逆順にソートします。
numbers.sort(reverse=True)

# ソート後のリストを表示します。
print(numbers)
# Output: [9, 7, 5, 3, 1]

sort()メソッドはリスト内の全ての要素が比較可能であることを前提としています。つまり、数値と文字列が混在するようなリストをソートしようとするとエラーが発生します。

全ての要素が比較可能な型であることを確認してからsort()メソッドを使用してください。

reverse:要素の順序を逆にする

reverse()メソッドはリスト内の要素の順序を逆にします。このメソッドは引数を取りません。

# リストを作成します。
numbers = [1, 2, 3, 4, 5]

# reverseメソッドを使ってリストの順序を逆にします。
numbers.reverse()

# 逆順になったリストを表示します。
print(numbers)
# Output: [5, 4, 3, 2, 1]

この例では、最初にnumbersリストを作成し、次にreverse()メソッドを使用してリストの順序を逆にしています。

Python:リストのスライシング

リストのスライシングについて解説します。

スライシングとは、リストから一部の要素を抽出するための機能です。

スライスは、開始インデックスと終了インデックスの2つのインデックスで指定します。

list[start:stop]

# startはスライスの開始位置
# stopはスライスの終了位置
# 
# このstopで指定したインデックスの要素は含まれません。
# つまり、startは「含む」、stopは「含まない」という意味になります。

以下に具体的な例を示します。

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
print(fruits[1:3])  # ['banana', 'cherry']

上記の例では、インデックス1('banana')から始まり、インデックス3('date')より前で終わる新しいリストが作成されます。

スライシングには省略形もあります。開始インデックスを省略すると、Pythonはそれを0とみなします。一方、終了インデックスを省略すると、Pythonはそれをリストの長さとみなします。

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
print(fruits[:3])  # ['apple', 'banana', 'cherry']
print(fruits[2:])  # ['cherry', 'date', 'elderberry']

さらに、スライスは負のインデックスもサポートしています。これにより、リストの末尾から逆順に要素を取り出すことができます。

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
print(fruits[-2:])  # ['date', 'elderberry']

さらに高度なスライシングでは、第3の引数としてステップ(step)を指定することもできます。これにより、スライスする要素を特定の間隔で選択することができます。

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
print(fruits[::2])  # ['apple', 'cherry', 'elderberry']

# この例では、リスト全体がスライスされ、
# 始めから終わりまで2つ飛ばしに要素が選択されます。

これらのスライシングの機能を用いることで、Pythonのリストから部分的なデータを効率的に取り出すことが可能になります。

Python:リストを利用する際の注意点

最後にリストを利用する際の注意点を整理します。

リストを利用する際の注意点
  • リストの大きさ: リストは任意の数の要素を保存できます。が、リストが大きすぎるとメモリを大量に消費します。また、リストの要素が増えるにつれて、特定の操作(例えば要素の検索や挿入)に必要な時間も増えます。
  • 可変性: リストは可変(mutable)なオブジェクトです。つまり、一度作成したリストの要素を変更することができます。この特性は便利ですが、リストを不注意に変更してしまうと予期しないバグを引き起こす可能性があります。また、リストを他のリストにコピーするときには、深いコピーと浅いコピーの違いに注意しなければなりません。
  • 異なるデータ型の要素: Pythonのリストは任意のデータ型の要素を格納できます。これは便利な特性ですが、異なるデータ型の要素が混在するリストを操作する際には注意が必要です。特に、数値と文字列が混在するリストをソートしようとするとエラーが発生します。
  • インデックス範囲: リストの要素にアクセスするときには、インデックスがリストの範囲内であることを確認する必要があります。リストの範囲外のインデックスにアクセスしようとするとエラーが発生します。
# ライブラリのインポート
import copy
import random

# 1. リストの大きさ
# リストが大きすぎるとメモリを大量に消費する可能性があります。
big_list = [random.randint(0, 100) for _ in range(10**6)]  # 要素が100万個の大きなリストを作成します
print(len(big_list))  # リストの長さを表示します

# 2. 可変性
# リストを不注意に変更してしまうと予期しないバグを引き起こす可能性があります。
# また、リストを他のリストにコピーするときには、深いコピーと浅いコピーの違いに注意しなければなりません。
original_list = [1, 2, 3, ['a', 'b', 'c']]
shallow_copy = list(original_list)  # 浅いコピーを作成します
deep_copy = copy.deepcopy(original_list)  # 深いコピーを作成します
original_list[-1].append('d')  # 元のリストの最後の要素(リスト)に新しい要素を追加します
print(original_list)  # [[1, 2, 3, ['a', 'b', 'c', 'd']]]
print(shallow_copy)  # 浅いコピーの中のリストも変更されます:[1, 2, 3, ['a', 'b', 'c', 'd']]
print(deep_copy)  # 深いコピーの中のリストは変更されません:[1, 2, 3, ['a', 'b', 'c']]

# 3. 異なるデータ型の要素
# 異なるデータ型の要素が混在するリストを操作する際には注意が必要です。
mixed_list = [1, 'two', 3, 'four']
try:
    mixed_list.sort()  # 異なるデータ型の要素が混在するリストをソートしようとするとエラーが発生します
except TypeError as e:
    print(f"Error: {e}")

# 4. インデックス範囲
# リストの要素にアクセスするときには、インデックスがリストの範囲内であることを確認する必要があります。
small_list = [1, 2, 3, 4, 5]
try:
    print(small_list[10])  # リストの範囲外のインデックスにアクセスしようとするとエラーが発生します
except IndexError as e:
    print(f"Error: {e}")

以上の点に注意しながらリストを使用することで、Pythonのリストの持つ強力な機能を最大限に活用することができるでしょう。

Python:リストのまとめ

Python:リストのまとめ
  • リストはPythonの基本的なデータ構造で順序付けられた要素の集合を保持
  • リストは異なるタイプのデータを含むことができる
  • リストは可変性を持つため一度作成した後でも要素の追加・削除・変更が可能
  • リストは0から始まるインデックスを用いてアクセス
    →スライシングを用いて部分的にデータを取り出すことが可能
  • リストは組み込みのメソッドを多数持ちこれらを用いて要素の追加・削除・ソートなどを行うことができる

最後のまとめとして様々なサンプルコードを以下に整理しました。

##################################################
# 好きなアイスクリームのフレーバーをランダムに選ぶ #
##################################################
import random

ice_cream_flavors = ['Vanilla', 'Chocolate', 'Strawberry', 'Rum Raisin', 'Mint Chocolate Chip', 'Cookie Dough']
my_flavor = random.choice(ice_cream_flavors)

print(f"Today, I'm going to have {my_flavor} ice cream!")

################################
# 映画のリストからトップ3を選ぶ #
################################
my_favorite_movies = ['Star Wars', 'The Godfather', 'Pulp Fiction', 'The Shawshank Redemption', 'The Dark Knight', 'Fight Club']
top_3_movies = my_favorite_movies[:3]

print(f"My top 3 favorite movies are: {top_3_movies}")

###############################
# リストに新しい要素を追加する #
###############################
my_hobbies = ['Reading', 'Coding', 'Hiking']
print(f"My current hobbies: {my_hobbies}")

new_hobby = 'Photography'
my_hobbies.append(new_hobby)
print(f"My hobbies after adding a new one: {my_hobbies}")

始めてPythonを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。

Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!

読者料典 Python入門:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
Python
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました