[初心者向け]Python基礎《リスト》
こんにちは!
僕は普段趣味でプログラミングをぼちぼちやってます。
僕が学んだことなどをnoteにまとめているので、プログラミングに興味がある人や普段のパソコン作業を自動化したい!という人の役に立てれば良いなと思っています。
今回はPythonのリストについて初心者の人に向けてまとめました。
リストとは
基本的なデータ構造の一つで、複数のデータを順序を付けて格納することができる複合データ型(コンテナ/コレクション)をリストという。
IT用語辞典 e-wordsより引用
簡単に言えば、1つの変数で複数のデータを管理する事ができます。ということですね。
リストでデータを管理すると繰り返し処理などでリスト内の各データに対して順番に処理を加えたりする事ができるのでとても便利です。
Pythonのリストに触れてみる
リストについて対話モードを使って色々見ていきましょう。
まずはリストの作成方法です。
>>> li = list()
>>> li2 = []
>>> li
[]
>>> li2
[]
このようにlist関数を使うか、空の角括弧を書くことで空のリストを作成する事ができます。
以下のコードのように初めからリストにデータを持たせておくこともできます。
>>> li = [1, 2, 3, 4, 5]
>>> li2 = ["hello", "Python", "Programming"]
あらかじめ空のリストを作成しておいて後からそのリストにデータを入れていくこともできますし、始めからデータを入れておくこともできるので、あなたのプログラムでやりたい事に応じて使い分けるといいと思います。
リストには異なるデータ型を混在させる事も可能です。
>>> li = [1, 2, "hello", 1.3]
このように変数liのなかにリスト型としてデータを入れましたがint型・str型・float型が混在していますね。
こういったデータの持たせ方もできるという事は知っておいてください。
リストのインデックス・スライス
次はリストのインデックス指定とスライスについて見ていきましょう。
[初心者向け]Python基礎《文字列》でもインデックスやスライスについて説明していますので是非見てください。
リストを作成してインデックス指定やスライスでデータを抽出してみます。
リストをインデックス指定する
>>> li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li[4]
5
>>> li[8]
9
>>> li[10] #error
Traceback (most recent call last):
File "<string>", line 1, in <module>
IndexError: list index out of range
1〜10までの整数型をリストに格納しています。
インデックスを指定する時に注意しないといけないのは先頭が1からではなく0から始まるというところです。
1.2.3.4.5...と数えるのではなく0.1.2.3.4.5.....と数えます。
なので
インデックス指定でli[4]は5が返ってきます。
同じようにli[8]だと9が返ってきます。
インデックスの範囲外の指定をするとエラーになり、最後の1行では『リスト インデックスが範囲外です』と言ってますね。
インデックスは、末尾から数えて指定する事が可能で、末尾からの場合はマイナスの整数で指定します。
その時の数え初めは0ではなく-1から始まります。
この辺が少しややこしいですが、-0という数字はあまり馴染みが無いので-1から始まるのが普通なのかなと思います。
>>> li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li[-3]
8
>>> li[-7]
4
>>> li[-15]
Traceback (most recent call last):
File "<string>", line 1, in <module>
IndexError: list index out of range
-3なので末尾から数えて3番目の数値は8です。
-7は末尾から数えて7番目なので数値は4になります。
-15はインデックス範囲外なのでエラーがでます。
インデックス指定はこんな感じです。
続いてスライスにいきましょう。
リスト内の特定のデータをスライスで抽出する
リスト内のデータをスライスで抽出する時はインデックス指定と同じような感じで指定します。
結果はリストで返ってきます。
>>> li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li[3:5]
[4, 5]
>>> li[3:]
[4, 5, 6, 7, 8, 9, 10]
>>> li[:6]
[1, 2, 3, 4, 5, 6]
>>> li[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
色んな方法がありますね。
li[3:5]ではindex3からindex5-1のデータが抽出できています。
li[3:]ではindex3からリストの最後までのデータが抽出できています。
li[:6]ではリストの最初からindex6-1までのデータが抽出できています。
li[:]ではリストの全てのデータを抽出しています。
li[::-1]とするとリスト内の要素を末尾から順に抽出してくれます。
スライスの形式としてはlist[start : end : step]という感じです、このステップを-1にする事で逆順になります。
普通にステップを2とかで指定すれば1つ飛ばしで抽出したりすることもできます。
>>> li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li[::2]
[1, 3, 5, 7, 9]
このようにスライスで色んなデータの抽出の方法があります。
文字列の記事ではスライスの覚え方を例として少し提案しています。よかったら参考にしてください。
スライスは、ややこしいですが繰り返して練習すればだんだん慣れてくるので是非色々やってみてください。
リストのデータを操作する(変更・結合・追加・挿入)
ここからはリストのデータを操作する方法を見ていきましょう。
リスト内のデータを変更する
リスト内のデータは変更可能(ミュータブルという)です。
なので先程のインデックス指定を使って特定のデータを変更する事ができます。やり方は簡単です。
>>> li = [1, 2, 3, 4, 5]
>>> li[2] = 30
>>> li
[1, 2, 30, 4, 5]
>>> li[0] = 0
>>> li
[0, 2, 30, 4, 5]
このようにインデックスで指定したデータを変更できたと思います。
このように簡単にデータを変更する事ができるのでとても扱いやすいです。
リストに別のデータを結合したり追加したりする
リストは後からデータを結合したり追加する事ができます。
結合や追加方法は様々なので一つずつ見ていきましょう。
>>> li = [1, 2, 3, 4, 5]
>>> li + [6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10]
>>> li
[1, 2, 3, 4, 5]
始めに1〜5までの整数でリストを作成しています。
その次でliに6〜10までの整数リストを追加しています。
ここで気をつけるのは、この足し算は一時的なものという事です。足し算をした後でliの中身を見てみると追加した6〜10が消えていますよね。
なので追加した状態を保持しておきたい場合はもう一度変数liに再代入するか別の変数を新たに作成して代入しておく必要があります。
>>> li = [1, 2, 3, 4, 5]
>>> li = li + [6, 7, 8, 9, 10]
>>> li
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10]
リストに掛け算をすると掛けた数だけリストの中身が繰り返されて増えます。
>>> li = [1, 2, 3, 4, 5]
>>> li * 3
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
あまり使う機会は無いかもしれませんが、こういった使い方もできるという事は知っておいた方がいいです。
ここからはリスト型のメソッドを使ってデータを結合する方法をみていきましょう。
extend()を使う
extendメソッドを使うと、あるリストに別のリスト内のデータを結合する事ができます。
>>> li = [1, 2, 3, 4]
>>> li2 = [5, 6, 7, 8, 9, 10]
>>> li.extend(li2)
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
「+」演算子を使った場合と同じ結果になりますが、気をつけないといけないのはextendメソッドを実行した時点でliの中身が変更された状態になったということです。
「+」演算子を使った結合の場合は再代入するか新たに変数を作成して代入しないといけなかったですよね。
なので追加したいけど素になるリストも残しておきたい場合には「+」演算子を使って結合して、素になるリストは必要ない場合はextendメソッドを利用する。
などといった使い分けが必要になってきますのであなたのプログラムに合う方法を選択してください。
append()を使う
appendメソッドを使うと、あるリストの末尾にデータを追加する事ができます。
>>> li = [1, 2, 3, 4, 5]
>>> li.append(6)
>>> li
[1, 2, 3, 4, 5, 6]
>>> li.append(7)
>>> li
[1, 2, 3, 4, 5, 6, 7]
追加されていますね。
ただ、append()にリストを渡すと結合ではなくリスト自体を要素として追加するので注意してください。
>>> li = [1, 2, 3, 4]
>>> li.append(5)
>>> li2 = [6, 7, 8]
>>> li.append(li2)
>>> li
[1, 2, 3, 4, 5, [6, 7, 8]]
appendメソッドにli2を渡すと[6, 7, 8]がそのまま追加されましたね。
appendメソッドにリストを渡す場合は、先程のextendメソッドと同様に場面を選んで使う事が大事です。
insert()を使う
insertメソッドを使うと、あるリストの指定した場所にデータを追加する事ができます。
インデックス指定が役に立ちます。
>>> li = [1, 2, 3, 4, 5, 6, 7, 8, 9 ,10]
>>> li.insert(3, "Python")
>>> li
[1, 2, 3, 'Python', 4, 5, 6, 7, 8, 9, 10]
>>> li.insert(7, 700)
>>> li
[1, 2, 3, 'Python', 4, 5, 6, 700, 7, 8, 9, 10]
insertメソッドの第一引数にインデックスを指定、第二引数には挿入するデータを指定します。
初めにインデックス3の場所に文字列「Python」を指定しています。
挿入されたので元々インデックス3の場所にあった整数の4から後ろが全てズレているのがわかると思います。
次にインデックス7に整数の700を指定したのでその場所に挿入されているのがわかると思います。
リストのデータを操作する(削除)
リスト内のデータを削除する方法も色々あるので順番に見ていきましょう。
pop()を使う
popメソッドを使うと指定した位置に存在するデータを削除してその要素を返してくれます。
ここでもインデックスが役に立ちます。
>>> li = [1, 2, 3, 4, 5]
>>> li.pop(3)
4
>>> li
[1, 2, 3, 5]
>>> li.pop(1)
2
>>> li
[1, 3, 5]
>>> li.pop()
5
>>> li
[1, 3]
popメソッドの引数には対象のデータのインデックスを指定します。
実行すると、指定したインデックスのデータが削除されて表示されているのがわかると思います。
また、引数を省略した場合はリストの末尾のデータを削除してくれます。
よくカードゲームなどで山札をリストとして格納しておいて、山札をドローする場合にpopメソッドが利用されているのを見ます。
remove()を使う
removeメソッドを使うと、引数で指定したデータと等価のデータが存在すればインデックスの若い方から見て最初に見つかったデータを削除してくれます。
>>> li = [1, 2, 3, 4, 5, 4, 3, 2, 1]
>>> li.remove(4)
>>> li
[1, 2, 3, 5, 4, 3, 2, 1]
>>> li.remove(2)
>>> li
[1, 3, 5, 4, 3, 2, 1]
>>> li.remove(10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
初めのremove(4)ではリスト内のインデックス3にあった整数の4が削除されています。
次はインデックス1にあった整数の2が削除されています。
最後はリスト内に存在しないデータを指定してみると「そんなデータはリスト内には存在しないよ」と、エラーが出ました。
このエラーを回避するためには後々出てくる制御系の構文のif文などを使って条件をつけてあげれば回避する事が可能です。
clear()を使う
clearメソッドを使うとリスト内のデータを全て削除する事が出来ます。
>>> li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li.clear()
>>> li
[]
空っぽになっちゃいましたね...。
リストのデータのインデックスなどを調べる
index()を使う
indexメソッドを使うとリストの中で引数と等しい値を持つ最初のデータのインデックス番号を返してくれます。
>>> li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li.index(3)
2
>>> li.index(7)
6
>>> li.index(100)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 100 is not in list
引数で指定した値と同じ値が存在するインデックス番号が出力されていますね。
リスト内に存在しない値を渡すと「その値はリストには存在しないよ」と、エラーが出ます。
count()を使う
countメソッドを使うと引数に指定した値がリスト内に何個あるかを返してくれます。
>>> li = [1, 2, 3, 4, 5, 4, 3, 4, 3, 2, 1]
>>> li.count(2)
2
>>> li.count(3)
3
>>> li.count(1)
2
>>> li.count(5)
1
引数で指定した値がリスト内に何個あるかをちゃんと調べて返してくれていますね。
また、個数はわかりませんがリストの中に要素が存在するかどうかを調べる方法もあります。
Pythonの予約後のin演算子を使います。
>>> li = [1, 2, 3, 4, 5, 4, 3, 4, 3, 2, 1]
>>> 3 in li
True
>>> 5 in li
True
>>> 7 in li
False
3 in li とする事で、3という値がliに含まれているのかどうかを確認する事が出来ます。
返り値はTrueかFalseの二種類で、正しかったらTrueで間違っていたらFalseになります。
今回で言うと3 in liはリストの中に3があるかどうかを判定し、答えは「正しい」になるのでTrueが出力されていると言う事ですね。
最後の7 in liは、リストの中に7が無いので答えは「間違っている」となるのでFalseが出力されています。
リストの長さを調べる
最後はリストの長さ(データの数)を調べる方法です。
文字列の記事でも出てきたlen関数を使います。
>>> li = [1, 2, 3, 4, 5, 6, 7, 8, 9 ,10]
>>> len(li)
10
リストの長さを調べる事が出来ました。
繰り返し処理の時などにリストの長さの回数だけ処理を繰り返すというのをこのlen関数を使って実装する事ができるので知っておくと便利ですね。
まとめ的なやつ
今回はPythonのリストについて色々解説しました。
リストはプログラムでかなり使うものなので是非色々な使い方を知ってあなたのプログラムに役立ててください!
リストのソート(並べ替え)などのメソッドもあるので余裕が出来たら一度調べてみてください。
最後まで読んでいただきありがとうございました!
では、またお会いしましょう!