Pythonの「リスト」は、複数のデータをひとつの変数にまとめて格納できる機能です。リストが使いこなせるようになると、数値や文字列など大量の値・データをスムーズに扱えます。要素の追加や削除、検索やソートなど、複雑な操作もリストなら簡単に実現できます。
しかし、Pythonのリストは通常の変数とは異なり、構文が独特でさまざまな機能があるため、わかりにくい部分もあるかもしれません。そこで本記事では、Pythonのリストの基本的な機能や使い方に加えて、応用テクニックについてもサンプルコード付きで解説します。
目次
Pythonの「リスト」は、複数の数値・文字列などのデータをまとめて扱える機能です。リストではなく通常の変数を使う場合は、以下のように1つの変数に1つの値しか格納できません。
//サンプルプログラム
# coding: Shift-JIS # 整数値を格納する number = 1 # 浮動小数点値を格納する point = 1.0 # 文字列を格納する string = "abc" # それぞれの値を表示する print(number) print(point) print(string)
//実行結果
上記のように、たとえば3つの値・データを格納する必要があるときは、3つの変数が必要です。しかしリストを使えば、以下のようにすべてのデータをまとめて扱えます。
//サンプルプログラム
# coding: Shift-JIS # 整数値・浮動小数点値・文字列を格納する list = [1, 1.0, "abc"] # それぞれの値を表示する print(list)
//実行結果
先ほどのソースコードと比べると、圧倒的に簡潔に記載できていることがわかるはずです。Pythonのリストに相当する機能は、他言語では「配列」と呼ばれることもありますが、どの言語でも効率的なプログラミングのために必須といっても過言ではありません。
Pythonでリストを使うと、以下3つのメリットが得られます。
Pythonのリストが他言語のリストや配列と異なるのは、「データ型に縛られない」ことです。たとえばC言語では、整数値のリストに文字列は格納できません。しかし、Pythonは前述したように、ひとつのリストに整数値・浮動小数点値・文字列など、さまざまな型の値・データを管理できることが魅力です。
また、要素の追加や削除に加えて、検索やソートなどの複雑な操作も、Pythonのリストでは簡単にできます。このように、プログラミングの柔軟性と効率性が大幅に高まることが、Pythonでリストを使うメリットです。
Pythonのリストの基本的な使い方について、以下3つのステップに分けて解説します。
リスト変数は、カンマで区切った要素を、「[ ]演算子」で囲むことで作成できます。まずは、中身がない「空のリスト」を作成してみましょう。
//サンプルプログラム
# coding: Shift-JIS # 空のリストを作成する list = [] # それぞれの値を表示する print(list)
//実行結果
「[ ]演算子」は、「この変数はリスト」だということを、明確に宣言するための記号です。今回は中身がない空のリストなので、print関数での表示結果も空になっています。
先ほど作成した空のリストには、「append関数」で要素を追加できます。append関数の詳細については後述しますが、追加したい値・データを引数として指定するだけでOKです。append関数の使い方は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 空のリストを作成する list = [] # append関数でリストに要素を追加する list.append(1) list.append(1.0) list.append("abc") # それぞれの値を表示する print(list)
//実行結果
なお、冒頭で紹介したサンプルコードのように、リストの作成と要素の追加を同時に行うことも可能です。これを「初期化」と呼び、この場合は空のリストは作成せず、最初から中身があるリストとなります。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する(リストの作成と要素の追加を同時に行う) list = [100, -1.0, "xyz"] # それぞれの値を表示する print(list)
//実行結果
作成したリストの各要素には、以下の構文で「[ ]演算子」を使うとアクセスできます。
リスト変数.[インデックス]
インデックスは「0」から始まることに注意が必要です。たとえば、トータルの要素数(サイズ)が「3」のリストの場合、最初の要素のインデックスは「0」、最後は「2」となります。つまり、アクセスできるインデックスは、「0」から「要素数(サイズ)-1」だということです。リストの要素へのアクセス方法を、以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する(リストの作成と要素の追加を同時に行う) list = [100, -1.0, "xyz"] # 0番目の要素を表示する print(list[0]) # 1番目の要素を表示する print(list[1]) # 2番目の要素を表示する print(list[2])
//実行結果
指定するインデックスさえ間違わなければ、要素へのアクセスは決して難しくありません。なお、上記のサンプルコードの場合は、「3」や「10」など範囲外のインデックスを指定すると、エラーとなるので注意が必要です。
以下3つのテクニックを知っておくと、Pythonのリストをより便利に使えます。
リストの「スライス」は、リストの一部要素を取り出して、別のリストを作成するための機能です。スライスの構文は以下のとおりです。
新しいリスト変数 = 元のリスト変数[開始インデックス:終了インデックス+1]
スライスしたいインデックスの範囲を「[ ]演算子」で囲むことで、リスト内の任意の部分を抽出できます。ただし終了インデックスには、実際に取り出す部分より1大きい値を指定しないといけません。たとえば、2番目から5番目の要素をスライスしたい場合は、「[2:6]」と記載する必要があります。スライスの使い方を以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する listA = [1, 2, 4, 8, 16, 32, 64] # listAの2番目から5番目の要素をスライスして取り出す listB = listA[2:6] # 最初のリストを表示する print(listA) # スライスしたリストを表示する print(listB)
//実行結果
「1, 2, 4, 8, 16, 32, 64」のリストの2番目から5番目の要素をスライスすると、「4, 8, 16, 32」の要素を持つリストが作成できます。インデックスが「0」から始まることや、終了位置には「1」大きい値を設定することに注意が必要です。
「リスト内包表記」は、リストの作成時に一定の条件でループを回し、簡潔にリストを作成することができる機能です。リスト内包表記の構文は以下のとおりです。
リスト変数 = [演算式 for ループ変数 in イテラブルオブジェクト]
いわば内部でforループを回しているようなものです。値の基準とするイテラブルオブジェクトを指定し、ループ変数と演算式で各要素の値を設定します。たとえば、1から9の3乗値の値をリストに設定したい場合は、「[i**3 for i in range(1, 10)]」と記載すればOKです。以下のサンプルコードで詳細を確認しましょう。
//サンプルプログラム
# coding: Shift-JIS # 1から10までの数値の3乗値をリストに格納する listA = [i**3 for i in range(1, 10)] # 最初のリストの各要素を2で割った値を別のリストに格納する listB = [i/2.0 for i in listA] # 1つ目のリストを表示する print(listA) # 2つ目のリストを表示する print(listB)
//実行結果
リスト内包表記は基本的にはforループと同じなので、イテラブルオブジェクトにはリストも指定できます。リスト作成後にforループで個別に値を設定するより、大幅に簡潔な記載ができます。なお、リスト内包表記は以下のように、if-else文などで条件分岐することも可能です。
//サンプルプログラム
# coding: Shift-JIS # 1から10までの数値の3乗値をリストに格納する listA = [i**3 for i in range(1, 10)] # 最初のリストから奇数値のみを取り出して別のリストに格納する listB = [i for i in listA if i % 2 != 0] # 最初のリストの値を「偶数」と「奇数」に分類するリストを作成する listC = ["偶数" if i % 2 == 0 else "奇数" for i in listA] # 1つ目のリストを表示する print(listA) # 2つ目のリストを表示する print(listB) # 3つ目のリストを表示する print(listC)
//実行結果
リスト内包表記は便利な機能ではありますが、多用するとソースコードの可読性が低下するので注意が必要です。
「in演算子」を使うと、リスト内に特定の値が含まれているかを検索できます。in演算子は以下のように、if文と組み合わせて使います。
if 検索したい値 in リスト変数:
検索したい値が含まれていないことを調べたい場合は、「not in演算子」が使えます。これらの演算子の使い方について、以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: Shift-JIS # 1から10までの数値の3乗値をリストに格納する listA = [i**3 for i in range(1, 10)] # リストの中身を表示する print(listA) # 「8」が含まれているか調べる if 8 in listA: print("「8」はリスト内にあります") else: print("「8」はリスト内にありません") # 「100」が含まれているか調べる if 100 not in listA: print("「100」はリスト内にありません") else: print("「100」はリスト内にあります")
//実行結果
なお、「in」や「not in」演算子は、文字列・リスト・タプルなど、複数のデータを持つ型で使えます。整数値や浮動小数点値など、1つのデータしかない型には使えないので注意が必要です。
Pythonのリストで使用できる、以下15個の便利な関数・メソッドについて解説します。
「append」は、リスト末尾に要素を追加するための関数で、以下の構文で使用します。
リスト変数.append(追加する要素)
append関数を使用すると、リストのサイズが自動的に拡張されて、末尾の要素として指定した値・データが格納されます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 空のリストを作成する list = [] # リスト末尾に要素を追加する list.append(1) list.append(2) list.append(3) # リストの中身を表示する print(list)
//実行結果
「insert」は、リストの任意の位置に要素を追加するための関数で、以下の構文で使用します。
リスト変数.insert(追加するインデックス, 追加する要素)
insert関数は、第1引数に追加先のインデックス、第2引数に追加する要素を指定することがポイント。insert関数の使い方は、以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 空のリストを作成する list = [] # 指定した場所に要素を追加する list.insert(0, "a") list.insert(1, "b") list.insert(0, "c") list.insert(3, "d") list.insert(9, "x") # リストの中身を表示する print(list)
//実行結果
なお、追加先のインデックスに範囲外の場所を指定した場合は、append関数のように末尾に要素が追加されます。また以下のように、要素ではなくリストを挿入することも可能です。
//サンプルプログラム
# coding: Shift-JIS # 1つ目のリストを作成する listA = [1, 2, 3] # 2つ目のリストを作成する listB = [4, 5, 6] # listAの任意の位置にlistBを挿入する listA.insert(1, listB) # リストの中身を表示する print(listA)
//実行結果
「extend」は、リスト末尾に別のリストを追加するための関数で、以下の構文で使用します。
リスト変数.extend(別のリスト)
extend関数は、リスト同士を結合するために使います。ただし、引数に指定したリストは必ず末尾に追加されるので、任意の場所に挿入したい場合は前述したinsert関数を使用しましょう。また、「+演算子」を使用した場合は、extend関数と同様の効果が得られます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 1つ目のリストを作成する listA = [1, 2, 3] # 2つ目のリストを作成する listB = [4, 5, 6] # listAの末尾にlistBを結合する # 「listA += listB」でも同様の効果が得られる listA.extend(listB) # リストの中身を表示する print(listA)
//実行結果
「remove」は、リスト内の指定した要素を削除するための関数で、以下の構文で使用します。
リスト変数.remove(削除する要素)
remove関数を使用すると、引数に指定した要素の検索を行い、該当する要素を削除します。ただし要素が重複する場合は、最初の要素のみ削除されるので、まとめて削除することはできません。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 1, 2, 3, 5, 5, 5] # listから「1」を削除する list.remove(1) # リストの中身を表示する print(list)
//実行結果
なお、重複するすべての要素をまとめて削除したい場合は、重複を認めない集合型「set」に一度変換し、もう一度リストに変換し直すのが簡単なやり方です。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する nums = [1, 1, 2, 3, 5, 5, 5] # listからすべての重複要素を削除する nums = list(set(nums)) # リストの中身を表示する print(nums)
//実行結果
「pop」は、リスト末尾および指定インデックスの要素を削除するための関数で、以下の構文で使用します。
リスト変数.pop() リスト変数.pop(削除するインデックス)
pop関数には2種類あり、1つ目は単純に末尾の要素を削除するもので、2つ目は指定したインデックスの要素を削除できます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 2, 3, 4, 5] print(list) # listから末尾の要素を削除する list.pop() print(list) # listから1番目の要素を削除する list.pop(1) print(list)
//実行結果
「clear」は、リストの全要素を削除して初期化するための関数で、以下の構文で使用します。
リスト変数.clear()
clear関数は引数を取らず、呼び出すだけですべての要素が削除され、空のリストになります。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 2, 3, 4, 5] print(list) # リストのすべての要素を削除する list.clear() print(list)
//実行結果
「len」は、リストの要素数(サイズ)を取得するための関数で、以下の構文で使用します。
リストサイズ = len(リスト変数)
len関数は、引数としてリスト変数を取り、戻り値として要素数(サイズ)を返します。リストの要素数を調べたいときは、以下のサンプルコードのようにlen関数を呼び出しましょう。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 2, 3, 4, 5] print(list) # リストの要素数を調べる print(len(list))
//実行結果
「index」は、指定した要素の最初のインデックスを取得するための関数で、以下の構文で使用します。
指定した要素のインデックス = リスト変数.index(調べたい要素)
index関数の引数として、インデックス値を調べたい要素を指定するだけでOKです。ただし、要素が重複する場合は最初の要素のインデックスが返り、存在しない要素を指定した場合はエラーが出ます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 2, 3, 4, 5, 3] print(list) # リスト内の要素「3」のインデックスを調べる print(list.index(3))
//実行結果
「count」は、リスト内にある要素の数を取得するための関数で、以下の構文で使用します。
重複する要素数 = リスト変数.count(調べたい要素)
リスト内に同じ要素がいくつあるか、重複回数を調べたいときは、以下のサンプルコードのようにcount関数を使いましょう。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [3, 1, 2, 3, 3, 3, 4, 5, 3] print(list) # リスト内に要素「3」が登場する回数を調べる print(list.count(3))
//実行結果
「sort」は、リスト内の要素を並べ替えるための関数で、以下の構文で使用します。
リスト変数.sort()
sort関数を呼び出すと、元のリスト自体が変更されるので注意が必要です。元のリストを維持したい場合は、あらかじめ「copy.deepcopy関数」でディープコピーしてからsort関数を呼び出すか、後述する「sorted関数」を使用しましょう。
なお、sort関数は「昇順(小さい順)」がデフォルトです。もし「降順(大きい順)」で並び替えたい場合は、引数として「reverse = True」を指定しましょう。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # copyライブラリを使用する import copy # リストを作成する list = [3, 1, 4, 2, 7, 5, 6, 8] print(list) # リストをディープコピーしてから昇順ソートする copyA = copy.deepcopy(list) copyA.sort() print(copyA) # リストをディープコピーしてから降順ソートする copyB = copy.deepcopy(list) copyB.sort(reverse = True) print(copyB)
//実行結果
「sorted」は、ソート済みのリストを取得するための関数で、以下の構文で使用します。
ソート済みリスト = sort(リスト変数)
先ほどのsort関数とは異なり、sorted関数は引数としてリスト変数を取ることや、元のリストの内容が変更されないことが特徴です。そのため、元のデータを保持したいときは、以下のサンプルコードのようにsorted関数を使うと便利です。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [3, 1, 4, 2, 7, 5, 6, 8] print(list) # リストを昇順ソートする print(sorted(list)) # リストを降順ソートする print(sorted(list, reverse = True))
//実行結果
「reverse」は、リストを逆順に並べ替えるための関数で、以下の構文で使用します。
リスト変数.reverse()
reverse関数を呼び出すだけで、リストの内容が逆順になります。ただし、呼び出したリストに上書きされるので、元のリストを維持したい場合は「copy.deepcopy関数」でディープコピーしておきましょう。reverse関数の使い方は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 2, 3, 4, 5] print(list) # リストを逆順に並べ替える list.reverse() print(list)
//実行結果
「join」は、リストを文字列に変換するための関数で、以下の構文で使用します。
文字列変数 = "".join(リスト変数)
join関数を呼び出す前に空文字列を置くことや、引数としてリスト変数を渡すことがポイントです。なお、join関数で文字列に変換できるのは、リストの全要素が文字列である場合に限られます。整数型や浮動小数点型などが含まれる場合はエラーが出ます。join関数の使い方は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 文字列リストを作成する list = ["abc", "def", "ghi", "jkl", "mno"] print(list) # リストを文字列に変換する str = "".join(list) print(str)
//実行結果
「max」は、リスト内の要素の最大値を取得するための関数で、以下の構文で使用します。
最大値 = max(リスト変数)
ただし、リスト内に数値と文字列が共存する場合はmax関数が使えないので、あらかじめ数値と文字列を別のリストに分ける必要があります。max関数は以下のサンプルコードのように使います。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 5.0, -100, 1000.0, 30] print(list) # リストの最大値を取得する print(max(list))
//実行結果
なお、文字列のリストに対してmax関数を使用した場合は、以下のように「辞書式」で最後に登場する文字列が最大値となります。
//サンプルプログラム
# coding: Shift-JIS # 文字列リストを作成する list = ["a", "b", "aaa", "bb", "z"] print(list) # リストの最大値(辞書式で最後に登場する文字列)を取得する print(max(list))
//実行結果
「min」は、リスト内の要素の最小値を取得するための関数で、以下の構文で使用します。
最小値 = min(リスト変数)
max関数と同様に、リスト内に数値と文字列が共存する場合はmin関数が使えません。min関数の使い方は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 5.0, -100, 1000.0, 30] print(list) # リストの最小値を取得する print(min(list))
//実行結果
文字列のリストに対してmin関数を使用した場合は、以下のように「辞書式」で最初に登場する文字列が最小値となります。
//サンプルプログラム
# coding: Shift-JIS # 文字列リストを作成する list = ["a", "b", "aaa", "bb", "z"] print(list) # リストの最小値(辞書式で最初に登場する文字列)を取得する print(min(list))
//実行結果
これまで解説したのは「1次元リスト」ですが、Pythonでは「2次元リスト」も簡単に作成できます。2次元リストの作成方法やアクセス方法は、以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 2次元リストを作成する _2Dlist = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ] # 2次元リストを作成する print(_2Dlist) # 2次元リストの2行目(インデックス[1])に新しい要素を追加する _2Dlist[1].append(100) # 2次元リストの3行目・2列目の要素(インデックス[2][1])にアクセスする print(_2Dlist[2][1]) # 2次元リストの全要素にfor文でアクセスする for _1Dlist in _2Dlist: for element in _1Dlist: print(element)
//実行結果
2次元リストは、初期化時に「[ ]演算子」を2重にして使うことで、2次元であることを明確化します。要素の追加時は、インデックスで行数を指定し、1次元リストと同じく「append関数」を使用します。アクセス時は「[行数][列数]」の順番でインデックスを使用し、forループでのアクセスも「行→列」の順番で行うことが大切です。
Pythonのリストは、大量のデータをひとつの変数で扱える、非常に便利な機能です。要素の追加と削除、並び替えや検索なども既存の関数・メソッドで行えるので、使い方さえ覚えれば高度なデータ操作ができるようになります。二次元リストも簡単に作れるので、画像処理やゲーム制作に応用することも可能です。
2024.06.17
子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介
#プログラミングスクール
2022.01.06
【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説
#プログラミングスクール
2024.01.26
【未経験でも転職可】30代におすすめプログラミングスクール8選!
#プログラミングスクール
2024.01.26
初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説
#JAVA
2024.01.26
忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説
#プログラミングスクール
2022.01.06
【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介
#プログラミングスクール
2024.01.26
【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説
#プログラミングスクール
2024.01.26
【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説
#プログラミングスクール