はじめに
今回はPythonにおけるリストの使い方について解説していきます。
リストはあらゆるコードに存在し、データを取り扱う際に重要で、基本的なものです。
ぜひこの記事を読んで使えるようになってください。
目次
リストとは何か
リストとは、[ ]で構成されたデータの塊です。
データを取り扱う際にリストを使うことには、以下のようなメリットがあります。
- 多くのデータを一度に扱うことが出来る
- 削除、追加が容易
またリストの中には、文字列や数値のどちらのデータでも扱うことが可能です。
リストの作り方
では、実際にリストを作ってみましょう。
鍵カッコで囲み、データ同士は ‘,’ で区切ることで作ることが出来ます。
l = ['a', 'b', 'c', 'd', 'e', 'f']
またlist関数を使っても作ることができます。
l = list('abcdef')
print(l)
> ['a', 'b', 'c', 'd', 'e', 'f']
リストからのデータの取り出し、書き換え
色々な方法でデータを取り出したり書き換えたりすることが出来ます。
具体的には場所や取り出し方を宣言することによって実行されます。
実際にやってみましょう。
リスト内の番地は10進法が適用されているので0,1,2,3,4の順番になり、始まりはあくまで0なので注意してください。
l = ['a', 'b', 'c', 'd', 'e', 'f']
# リストの番地を指定することで取り出せます
l[0]
> 'a'
l[1]
> 'b'
# 範囲を指定してまとめて取り出すこともできます。
l[0:3]
> 'a', 'b', 'c', 'd'
# 0は省略できるので以下のようにも書けます。
l[:3]
> 'a', 'b', 'c', 'd'
また、データの中身を上書きすることも可能です。
l = ['a', 'b', 'c', 'd', 'e', 'f']
l[1] = 'A'
print(l)
> ['a', 'A', 'c', 'd', 'e', 'f']
リストの便利なメソッド
Pythonにおけるリストにはメソッドと呼ばれる様々な便利ツールが標準で常備されています。
今回はよく使用するであろう5つを紹介していきます。
- pop()
- append()
- remove()
- insert()
- join()
pop()
リストからデータを抜き出すことが出来ます。
ただし、抜き出した元データからは削除されるので注意してください。
l = ['a', 'b', 'c', 'd', 'e', 'f']
pop_l = l.pop(1)
print(pop_l)
> 'b'
print(l)
> ['a', 'c', 'd', 'e', 'f']
append()
リストの最後尾にデータを追加することが出来ます。
n = [1,2,3,4,5,6,7,8,9]
n.append(10) # 一番後ろに追加されます
print(n)
> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
remove()
特定のデータを削除できます。
何度もこのメソッドを使用することで、リストの中にデータがあるかどうかをエラーを通して確認できるエラーハンドリングも行うことが出来ます。
n = [1,2,2,2,3]
n.remove(2) # [1, 2, 2, 3]
n.remove(2)
n.remove(2)
print(n)
> [1, 3]
# ここでもう一度2を消そうとしてみます
n.remove(2)
この場合は削除できるデータがないので、以下のようなエラーが出ます。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
insert()
特定の位置にデータを挿入できます。
n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n.insert(0,0) # 追加位置を指定します
print(n)
> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
join()
リスト内のデータを全て結合することが出来ます。
l = ['a', 'b', 'c', 'd']
join_l = ''.join(l)
print(join_l)
> abcd
ただし、数値が混ざるときはそのまま結合することはできません。
なので、先にmap()関数を用いてmap型にデータを変換してから行う必要があります。
l = ['a', 'b', 'c', 2]
# map型に変換する必要があります
map_l = map(l)
join_l = ''.join(map_l)
print(join_l)
> abc2
ここではほんの一部だけ紹介しましたが、他にも様々なメソッドが存在します。
公式のドキュメントを参照してみてください。
Python公式ドキュメント: 5. データ構造 https://docs.python.org/ja/3/tutorial/datastructures.html
リストをよりコンパクトに書く方法
リストにある作業をし終えた後のデータを入れてたいこともあるかもしれません。
そんな時にはリストに中にコードを書くこともできます。この書き方を内包記と言います。
以下の例は、リスト内のデータから偶数だけ別のリストに移すコードです。
t = [1,2,3,4,5]
l =[]
for i in t:
if i % 2 == 0:
l.append(i)
print(l)
> [2, 4]
このコードを内包記で書くと、見た目が非常にすっきりします。
l = [i for i in t if i % 2 == 0]
ただし、for文が2回以上になると内包記が分かりづらくなるので、推奨されてはいません。
t1 = [1,2,3,4,5]
t2 = [6,7,8,9,10]
r = []
for i in t1:
for j in t2:
r.append(i * j)
print(r)
> [6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 21, 24, 27, 30, 24, 28, 32, 36, 40, 30, 35, 40, 45, 50]
これを内包記で書くと以下のようになります。
r = [i * j for i in t1 for j in t2]
注意事項: 値渡しと参照渡し
リストのデータをコピーして使いまわした時もあるかもしれません。
そんな時に注意していただきたいことがあります。
以下のコードをみて一緒に考えてみましょう。
まずはリストを作ってコピーします。
i = [1,2,3,4,5]
j = i
# 当然同じ結果が出ます
print(i)
> [1,2,3,4,5]
print(j)
> [1,2,3,4,5]
ここでデータを書き換えてみます。
j[0] = 100
# iの結果を見て見て下さい
print(j)
> [100,2,3,4,5]
print(i)
> [100,2,3,4,5] # ???
i のリストも書き換えられてしまいました。
これが参照渡しと呼ばれる現象です。
最初の j = i の代入ではデータの中身と一緒にそのアドレスも同時にコピーしてしまっています。
そのために、同じアドレスの場所を書き換えてしまうと全て書き換わってしまいます。
これは予期せぬエラーの原因にもなり得るので注意してください。
ただ、この現象は少し分かりにくいかもしれません。
なので、リストはそのままコピーするものではないと覚えておいていただければ結構です。
しかし、リストをコピーしたい時もあるかもしれません。
そんな時に、この参照渡しを回避する方法があります。
copy()というメソッドを使用する方法です。
x = [1,2,3,4,5]
# 参照渡しを避ける方法、これで参照渡しは起きません。
y = x.copy()
y[0] = 100
print(y)
> [100,2,3,4,5]
print(x)
> [1,2,3,4,5]
まとめ
今回は、リストとは何かから、便利なメソッドの使い方、リストを使う上での注意事項を解説しました。
この記事を読んでいるだけではすぐに忘れてしまうかもしれません。
是非自分で手を動かして、リストをマスターできるように勉強してみてください。
またSNSなどで手を動かして理解したことをアウトプットするなどもしてみましょう。