Pythonでスプレッド構文的なものでリストに要素を追加

最近JavaScriptを触ってたら、配列に要素を追加する方法として、スプレッド構文を使う方法を見かけました。

スプレッド構文で配列に要素を追加するには以下のようにやります。

let array = [0]
for(let i=1; i<4; i++){
    array = [...array, i]
    console.log(array)
}
// [ 0, 1 ]
// [ 0, 1, 2 ]
// [ 0, 1, 2, 3 ]

見た目的にもわかりやすいし、いいんじゃね??と思い、Pythonでも習得することにしました。

Pythonではスプレッド構文的なものとしてアンパックがあります。
アンパックは*演算子を使用するようです。

Python のアスタリスク (*) による List のアンパック
プログラミング言語 Python を始める人のための入門サイト。開発環境の設定方法、言語の基礎から少し発展的な話題まで、Python の基礎知識をわかりやすく整理しています。

このアンパックでJavaScriptと同じようにして、リストに要素を追加してみます。

lis = [0]
for i in range(1, 4):
    lis = [*lis, i]
    print(lis)
# [0, 1]
# [0, 1, 2]
# [0, 1, 2, 3]

JavaScriptと同じ結果になりました。
個人的にはappend()より、こっちの方が使いやすいですかね。
要素を挿入する位置も調整できますし。

ただ、append()より、かなり遅いので何回も使用する場合は注意が必要そうです。

import time

lis = []

start_time = time.time()
for i in range(100000):
    lis.append(i)
end_time = time.time()
print(end_time - start_time)
# 0.011091947555541992
lis = []

start_time = time.time()
for i in range(100000):
    lis = [*lis, i]
end_time = time.time()
print(end_time - start_time)
# 15.108353853225708

JavaScriptのドキュメントでもスプレッド構文を使用した要素の追加方法は紹介されていました。配列の連結にも使えるようですね。

スプレッド構文 - JavaScript | MDN
スプレッド構文 (...) を使うと、配列式や文字列などの反復可能オブジェクトを、0 個以上の引数 (関数呼び出しの場合) や要素 (配列リテラルの場合) を期待された場所で展開したり、オブジェクト式を、0 個以上のキーと値の組 (オブジェクトリテラルの場合) を期待された場所で展開したりすることができます。

コメント