Pythonのリストにデータを追加(append)する方法【extend, insert, スライス】
目次
- Pythonのリストに追加(append)する方法
- リストの末尾にデータを追加する
- appendの性能
- extendでリストを連結する
- +, +=演算子でリストを連結する
- insertでデータを挿入する
- スライスを使った挿入
- おわりに
Pythonのリストに追加(append)する方法
Pythonではリスト(list)を使うことができます。
このリストの末尾にデータを追加したい場合は、append()
というリストのメソッドを使います。
append()
のほかにはextend()
やinsert()
などがあります。
この記事ではPythonのリストにデータを追加する方法について詳しく解説します。
関連記事
リストの末尾にデータを追加する
リストの末尾にデータを追加するにはリストのメソッドであるappend()
を使います。
append()
に引数としてデータを渡すと、そのリストにデータを追加することができます。
たとえば↓のようにです。
lis = [1, 2, 3] lis.append(4) # リストの末尾にデータ(4)を追加 print(lis) # [1, 2, 3, 4]
append()
には整数の他にもいろいろなタイプのデータを渡せます。
文字列、タプル、リスト、辞書、集合、真偽値、Noneなどです。
lis = [] lis.append('abc') lis.append((1, 2)) lis.append([3, 4]) lis.append({'a': 5}) lis.append({6, 7}) lis.append(True) lis.append(None) print(lis) # ['abc', (1, 2), [3, 4], {'a': 5}, {6, 7}, True, None]
appendの性能
appendの性能は一般的に低いと言われています。
遅いということです。
そのため特定の用途に関してはappendは速度がネックになる可能性があります。
たとえば数列を作ってリストに保存したい、となった場合はappendを使う方法は遅くなる場合があります。
lis = [] for i in range(100): lis.append(i)
このようなケースではrangeやリスト内方表記を使ったほうが速度が出る場合があります。
# リスト内包表記を使って数列を生成 lis = [i for i in range(100)] # rangeを使って数列を生成 lis = list(range(100))
もっとも、これらがappendより速度が出る「保証」はありません。
環境によってはappendより遅くなる場合もあります。
↓のようなテストコードで環境ごとに速度を比較して検証する必要があります。
import time N = 50000000 # append start = time.time() lis = [] for i in range(N): lis.append(i) done_time = time.time() - start print('append', done_time) # リスト内包表記を使って数列を生成 start = time.time() lis = [i for i in range(N)] done_time = time.time() - start print('リスト内包表記', done_time) # rangeを使って数列を生成 start = time.time() lis = list(range(N)) done_time = time.time() - start print('range', done_time)
ちなみにWindows10のWSL2(Ubuntu20.04)の環境では↓のような結果になりました。
append 3.7587013244628906 リスト内包表記 2.17269229888916 range 1.2334296703338623
結果の単位は秒です。
一番早いのはrangeという結果になりました。
ただしこのようなテスト結果はOSなど環境が違う場合に異なる場合があります。
別の環境ではリスト内包表記の結果が一番早かった、というのもあり得る話です。
ですのでコードを動作させたい環境で計測し、その計測結果を参考にプロジェクトに反映させる、というのが良いと思います。
一般化できればいいのですが、なかなかそうは行かないです。
extendでリストを連結する
append()
の親戚にextend()
というメソッドもリストにはあります。
このメソッドを使うと別のリストをリストの末尾に連結することができます。
lis = [1, 2] lis.extend([3, 4]) print(lis) # [1, 2, 3, 4]
+, +=演算子でリストを連結する
+
演算子でリスト同士を連結することができます。
これはextend()
に近い操作です。
lis0 = [1, 2] lis1 = [3, 4] lis2 = lis0 + lis1 print(lis2) # [1, 2, 3, 4]
+=
演算子を使えばリストに別のリストを連結できます。
lis = [1, 2] lis += [3, 4] print(lis) # [1, 2, 3, 4]
insertでデータを挿入する
insert()
もappend()
の親戚です。
これは特定の添え字の位置にデータを挿入するメソッドです。
たとえばリストの先頭にデータを挿入したい場合は第1引数に0を指定します。
lis = [1, 2, 3] lis.insert(0, 4) # 添え字0の位置に4を挿入 print(lis) # [4, 1, 2, 3]
あるいはリストの途中に挿入したい場合は適当な添え字で指定します。
lis = [1, 2, 3] lis.insert(2, 4) # 添え字2の位置に4を挿入 print(lis) # [1, 2, 4, 3]
リストの末尾に挿入したい場合は↓のようにすると挿入できます。
lis = [1, 2, 3] lis.insert(len(lis), 4) # リストの末尾に4を挿入 print(lis) # [1, 2, 3, 4]
insert()
の効率はO(n)
です。
これはPythonのリストの実装(CPython)が動的配列になっているため、挿入の際に他のデータの移動が必要になるからです。
そのためinsert()
はあまり効率の良いメソッドではありません。
append()
はO(1)
になっているため論理上の効率的にはinsert()
よりappend()
のほうが良いみたいです。
スライスを使った挿入
リストをスライスしてそこにリストを代入すると、リストにデータを追加できます。
たとえば添え字1の位置にリストを挿入したい場合はlis[1:1]
のようにスライスします。
lis = [1, 2, 3] lis[1:1] = [10, 11, 12] print(lis) # [1, 10, 11, 12, 2, 3]
[1, 2, 3]
という数列の間に[10, 11, 12]
が挿入されて、[1, 10, 11, 12, 2, 3]
という数列になっているのがわかります。
スライスで範囲を指定した場合、その範囲のデータは挿入データで置き換えられます。
lis = [1, 2, 3] lis[1:2] = [10, 11, 12] print(lis) # [1, 10, 11, 12, 3]
↑の場合、2
が置換されているのがわかると思います。
おわりに
今回はPythonのリストの追加方法(append)について解説しました。
リストにデータを追加したいケースはよくありますので覚えておいて損はないかと思われます。
(^ _ ^) | appendでデータを追加しよう |
(・ v ・) | appendは「アペンド」って読むよ |