本記事では、pythonで用いられるデータ型の一つであるリストについてその使い方やいくつかのメソッドを紹介していこうと思います。
そもそも「リストって何?」というところから始まり、コピー方法やメソッドの説明など実践的な部分まで細かく説明しているのでぜひ最後まで見ていってください。
ちなみに、本ブログでは初心者の方でも理解できるように丁寧に説明しているので、全くの初心者という方も安心してください。
また、pythonをまだインストールしていないといった方は以下の記事を参考にしてインストールしてみましょう。
この記事でわかること
- リストについて
- リストの使い方
- リストのコピー方法
- リストのメソッド
リストについて
まずは、リストってそもそもどのようなもののことを指すのかについてご説明させていただこうと思います。
また、数値(int型・float型)や文字列(string型)についてよくわからないという方は、以下の記事から先に見ることをおすすめします。
リストとは?
リストとは、いくつかのデータを一つにまとめたものです。
データというのは、例えばint型やfloat型の数値であったり、string型の文字列であったりなんでもOKです。
とりあえず、これらのデータを複数用意してそれをひとまとまりにしたのがリストというわけです。
<input>
list_int = [1, 10, 32, 4, 6, 14, 8]
list_string = ["apple", "banana", "orange", "tomato"]
print(list_int, type(list_int))
print(list_string, type(list_string))
<output>
[1, 10, 32, 4, 6, 14, 8] <class 'list'>
['apple', 'banana', 'orange', 'tomato'] <class 'list'>
上記コードの『list_int』も『list_string』も両方リストなのですが、それぞれ要素の型が異なりますよね。
こういったように、整数や文字列をまとめて一つにしたものをリストと呼びます。
要素の取り出し方
では、ここからはリストの使い方をコードを用いてご紹介していこうと思います。
<input>
list = [1, 10, 32, 4, 6, 14, 8]
# リストの一部を取り出す
print(list[1])
print(list[-1])
print(list[1:3])
print(list[:2])
print(list[2:])
print(list[:])
<output>
10
8
[10, 32]
[1, 10]
[32, 4, 6, 14, 8]
[1, 10, 32, 4, 6, 14, 8]
まずはリストの要素の取り出し方です。
文字列に関する記事を見てくれた方ならわかると思いますが、基本的には文字列の時とやることは変わりません。
『list[0]』と記述すればリストの中の0番目の要素が出力されますし、『list[0:2]』と記述すればリストの中の0番目から1番目の要素が出力されます。
ここで気を付けてほしいのが、listの要素は1番目からではなく0番目からスタートしていることと、『list[0:2]』では2番目の要素は含まないということです。初めのうちはややこしいと思いますが、徐々に慣れていきましょう。
また、要素の部分にマイナスの数を入れると、後ろから数えることになります。
『list[-1]』ならば後ろから1番目の要素、『list[-2]』ならば後ろから二番目の要素といった感じですね。
多重リスト
続いて多重リストの作り方や使い方についてです。
<input>
list_int = [1, 10, 32, 4, 6, 14, 8]
list_string = ["apple", "banana", "orange", "tomato"]
newlist = [list_int, list_string]
print(newlist)
print(newlist[0])
print(newlist[1][2])
<output>
[[1, 10, 32, 4, 6, 14, 8], ['apple', 'banana', 'orange', 'tomato']]
[1, 10, 32, 4, 6, 14, 8]
orange
上記コードの『newlist』というリストが多重リストにあたります。
ここで、多重リストというのは、要素がリストになっているようなリストのことです。
よく『リストのリスト』という風に表現します。
多重リストの場合は、『newlist[0]』という風に0番目の要素を見ようとすると、0番目のリスト『list_int』が返ってきます。
また、『orange』などの要素となっているリストの要素を取り出したい場合は、1番目のリストの2番目の要素ということで『newlist[1][2]』と記述すれば大丈夫です。
リストの操作①(要素の変更)
続いてはリストの操作についてです。
まずは、要素の変更方法についてご紹介していこうと思います。
<input>
list = ["a", "b", "c", "d", "e", "f"]
# 0番目の要素を変更
list[0] = "new_a"
print(list)
# 1~2番目の要素を変更
list[1:3] = ["new_b", "new_c"]
print(list)
# 0番目~2番目の要素を変更
list[0:3] = []
print(list)
<output>
['new_a', 'b', 'c', 'd', 'e', 'f']
['new_a', 'new_b', 'new_c', 'd', 'e', 'f']
['d', 'e', 'f']
上記コードのように、リストに新たな要素を代入することで要素の変更を行うことが出来ます。
また、『[]』といった空の要素を代入すると要素を削除することもできます。
リストの操作②(要素の追加)
<input.
list = ["a", "b", "c", "d", "e", "f"]
# リストの最後尾に要素を追加
list.append("g")
print(list)
# リストの指定の位置に要素を追加
list.insert(0, "start")
print(list)
<output>
['a', 'b', 'c', 'd', 'e', 'f', 'g']
['start', 'a', 'b', 'c', 'd', 'e', 'f', 'g']
『append()』や『insert()』を使うとリストに要素を追加することが出来ます。
ちなみに、『insert()』では第一引数に要素の追加場所を設定すると、追加したい場所に要素を追加することが出来ます。
リストの操作③(要素の取り出し)
<input>
list = ["a", "b", "c", "d", "e", "f"]
# リストの0番目の要素を取り出し
print(list.pop(0))
print(list)
<output>
a
['b', 'c', 'd', 'e', 'f']
pop()を使うと、リストから要素を取り出すことが出来ます。
()の中に取り出したい要素の番号を入れる形ですね。
リストの操作④(要素の削除)
<input>
list = ["a", "b", "c", "d", "e", "f"]
# 番号を指定して要素を削除
del list[0]
print(list)
# 要素の値を指定して要素を削除
list.remove("b")
print(list)
<output>
['b', 'c', 'd', 'e', 'f']
['c', 'd', 'e', 'f']
要素の削除方法は『del』を用いる方法と『remove』を用いる方法の2パターンあります。
それぞれ削除する際の指定方法が異なるので注意しましょう。
リストの操作⑤(リストの連結)
<input>
list1 = ["a", "b", "c", "d", "e", "f"]
list2 = ["g", "h", "i", "j"]
newlist = list1 + list2
print(newlist)
<output>
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
上記のように「+」を使ってリスト同士を連結させることもできます。
リストのコピー
続いては、リストのコピーについてです。
リストをコピーする際は気を付けなければならないことがいくつかあるので、そこを中心的に確認していこうと思います。
正常に動作しない?間違ったコピー方法
<input>
list1 = ["a", "b", "c", "d", "e", "f"]
# リストのコピー
list2 = list1
list1[0] = "new_a"
print(list1)
print(list2)
<output>
['new_a', 'b', 'c', 'd', 'e', 'f']
['new_a', 'b', 'c', 'd', 'e', 'f']
皆さんは、この出力結果を見て何か違和感に気付けますか?
今回のコードでは、list2にlist1をコピーしてその後list1[0]だけ変更して二つのリストの出力を行おうとしているのですが、list2[0]にも変更が施されてしまっています。
list2[0]に対して何もしていないのになぜでしょう。
この問題を理解するためには「値渡し」と「参照渡し」に関する知識が必要なので、「そんな言葉知らない」という方は以下の記事を参考にして下さい。
正常に動作しなかった原因
正常に動作しなかった原因はずばり、リストのデータが参照渡しによって渡されているからです。
list2には、list1の住所のみが格納される形になっているため、list1の中身を変更するとlist2もそれに合わせて変更してしまいます。
もちろん逆もしかりで、list2の中身を変更すると、list1の中身も変わってしまうのです。
では、リストのコピーはできないのかというとそういうわけではありません。
以下で、正常にリストをコピーする方法をご紹介いたします。
正しいリストのコピー方法
では、先ほどの問題点を踏まえたうえで正しいリストのコピー方法を確認していきましょう。
<input>
list1 = ["a", "b", "c", "d", "e", "f"]
# リストのコピー
list2 = list1.copy()
list1[0] = "new_a"
print(list1)
print(list2)
<output>
['new_a', 'b', 'c', 'd', 'e', 'f']
['a', 'b', 'c', 'd', 'e', 'f']
これで正常にコピーが行えました。
先ほどのコードと比べて変更した点は、一行のみです。
先ほどのコードでは『list2 = list1』と記述していたので、list1のデータをlist2に参照渡ししてしまっていたのですが、今回のコードは『list1.copy()』といったlist1のコピーをlist2に渡しているので、値渡しを行っていることになります。
リストをコピーした後、どちらかのリストのみを操作したいという場合はこのような処理を書かないと正常に動作しないので気を付けましょう。
リストの様々なメソッド
ここからは、以下の順番でリストのメソッドを一部紹介していこうと思います。
- index:指定の要素を探す
- count:指定の要素の数を数える
- sort:リストの要素を大きさ順に並び替える
- reverse:リストの順番を逆にする
- split:文字列をリストに変換する
- join:リストを文字列に変換する
index:指定の要素を探す
<input>
list = [1, 2, 5, 2, 7, 4, 5, 2]
print(list.index(2))
print(list.index(2, 2))
<output>
1
3
index()は、指定の要素がリストの何番目に入っているのかを調べるためのメソッドです。
上記コードの『print(list.index(2))』ではリストの中から2という要素を探して何番目に入っているのかを出力しています。
しかし、これのみだと今回の例のように同じ要素が二つ以上入っていた場合に見つけることが出来ません。
例えば、『2』という数字であればリストの1番目、3番目、7番目に入っていますよね。
これを解決するために、第二引数を指定してあげます。
今回のコードの『print(list.index(2, 2))』という部分です。
第二引数では、要素探索のスタート地点を指定しています。
つまりこのコードだと、『2番目の要素以降から2を探す』といった命令になります。
なので3番目の2がコンピュータによって見つけられているといった感じですね。
count:指定の要素の数を数える
<input>
list = [1, 2, 5, 2, 7, 4, 5, 2]
print(list.count(2))
<output>
3
count()は名前の通り、指定した要素を数えるためのメソッドです。
今回は『2』を指定しているので、2の数が出力されています。
sort:リストの要素を大きさ順に並び替える
<input>
list = [1, 2, 5, 2, 7, 4, 5, 2]
list.sort()
print(list)
list.sort(reverse=True)
print(list)
<output>
[1, 2, 2, 2, 4, 5, 5, 7]
[7, 5, 5, 4, 2, 2, 2, 1]
sort()を使うと、リストの要素を大きさ順に並び替えることが出来ます。
『list.sort()』のように記述すれば小さい順に、『list.sort(reverse=True)』のように記述すれば大きい順に並び変えられるといった感じです。
reverse:リストの順番を逆にする
<input>
list = [1, 2, 5, 2, 7, 4, 5, 2]
list.reverse()
print(list)
<output>
[2, 5, 4, 7, 2, 5, 2, 1]
reverse()を使うと、リストの順番を逆にすることが出来ます。
split:文字列をリストに変換する
<input>
string = "I like soccer"
list = string.split()
print(string, type(string))
print(list, type(list))
<output>
I like soccer <class 'str'>
['I', 'like', 'soccer'] <class 'list'>
split()は、文字列のデータをリスト型に変換することが出来ます。
上記コードを見てもらえれば分かると思いますが、しっかりと変数『string』はstring型に、変数『list』はlist型になっていますよね。
ちなみに、splitは英語で分割するという意味があるので、『もともと1つになっている文字列を単語ごとにリストの要素に分けている』といったイメージを持ってもらえるとわかりやすいと思います。
join:リストを文字列に変換する
<input>
list = ["I", "like", "soccer"]
string1 = " ".join(list)
string2 = "%%%".join(list)
print(string1)
print(string2)
<output>
I like soccer
I%%%like%%%soccer
join()は先ほどのsplit()の逆で、リストから文字列を作成するメソッドになっています。
『○○.join()』で○○を間に入れて結合するといった意味になるので、○○の部分に空白等を入れてリストの要素同士をつなげます。
もちろん、空白を入れたくない場合は『""』と記述してもらえればよいですし、他の文字を入れたい場合も『"”』の中に好きな文字を入れてもらえればその文字でつなぐことが出来ます。
ちなみに、joinは英語で結合するという意味があるので、『バラバラになっているリストの要素をくっつけて1つの文字列にする』といったイメージを持ってもらえるとわかりやすいと思います。
まとめ
今回は、リストについてその使い方からメソッドまで紹介してきましたがいかがだったでしょうか。
リストは、複数のデータを扱う際に非常に有用で、いろいろな場面で重宝されているデータ型となっています。
本記事を通してよく理解して、自分でもガンガン使っていきましょう。
また、タプルと非常に似通っているリストですが、実は大きく性質が異なるため使用する場面が違います。
その説明は以下の記事で行っているので、興味がある方は是非ご覧ください。