原文: Python Empty List Tutorial – How to Create an Empty List in Python‌‌
原著者: Estefania Cassingena Navone
翻訳・翻案: Manabu Matsumoto

Python で、空リストを効率的に作成する方法を学びたいと思われているならば、この記事がお役に立てるでしょう。

ここでは以下の内容について学べます:

  • 角括弧 [] を使用して空リストを作成する方法。
  • list() を使用して空リストを作成する方法。
  • この 2 つの方法のユースケース。
  • それらの効率について (片方はもう一方の方法よりも高速です!)。この記事では、timeit モジュールを使用して効率を比較します。

さあはじめましょう!✨

🔹角括弧を使用して空リストを作成する

空の角括弧のペアを使用して、次のように空リストを作成できます:

create-empty-list-with-square-brackets

💡ヒント: 空リストを変数に代入して、その変数を後のプログラムで使用するようにしています。

これを例えば次のように記述します:

num = []

こちらで確認できるように、空リストの長さは 0 です:

>>> num = []
>>> len(num)
0

空リストは偽値なので、ブール値コンテキストにおいて False と評価されます:

>>> num = []
>>> bool(num)
False

空リストに要素を追加する

append() メソッドと insert() メソッドを使用して、空リストに要素を追加できます:

  • append() はリストの末尾に要素を追加します。
  • insert() はリストの特定のインデックスを選び、そこに要素を追加します。

リストは空であるかどうかに応じて、真値か偽値のどちらかに評価されるため、次のように条件文内で使用できます:

if num:
	print("This list is not empty")
else:
	print("This list is empty")

このコードの実行結果は次のようになります:

This list is empty

リストが空なので、False と評価されていますね。

一般に:

  • リストが空でなければ、True と評価され、上記の例では if 節が実行されます。
  • リストが空であれば、False と評価され、上記の例では else 節が実行されます。

例:

以下の例では空リストを作成し、それを変数 num に代入しています。次に for ループを使用して、最初は空だったリストに整数列の要素を追加します:

>>> num = []
>>> for i in range(3, 15, 2):
	num.append(i)

変数の値をチェックして、正常に要素が追加され、リストが空ではなくなったことを確認します:

>>> num
[3, 5, 7, 9, 11, 13]

💡ヒント: 空リストに最初の要素を加える際、通常は append() を使用しますが、insert() メソッドをインデックス 0 と一緒に呼び出すことでも、この要素を加えられます:

>>> num = []
>>> num.insert(0, 1.5) # 浮動小数点数の 1.5 をインデックス 0 に追加
>>> num
[1.5]

🔸list() コンストラクタを使用して空リストを作成する

別の方法として、新しいリストオブジェクトを作成する型コンストラクタの list() を使用することで、空のリストを作成できます。

Python の公式ドキュメントでは次のように説明されています:

If no argument is given, the constructor creates a new empty list, [].

(訳: もし引数が与えられなければ、コンストラクタは新しい空リスト [] を作成します。)

create-empty-list-with-list-method

💡ヒント: これにより、新しいリストオブジェクトがメモリ内に作成され、ここでは list() に引数を渡さなかったので空リストが作成されます。

これを例えば次のように記述します:

num = list()

こちらで確認できるように、空リストの長さは 0 です:

>>> num = list()
>>> len(num)
0

また、空リストは偽値です (ブール値コンテキストでは False と評価されます):

>>> num = list()
>>> bool(num)
False

例:

この空リストは完全にリストとして機能するので、要素を加えることができます:

>>> num = list()
>>> for i in range(3, 15, 2):
	num.append(i)

こちらで確認できるように、上記のコードを実行すると空ではないリストが得られます:

>>> num
[3, 5, 7, 9, 11, 13]

🔹ユースケース

  • 通常、list() は文字列、辞書 (dictionary)、タプル (tuple) といった、既存のイテラブルからリストを作成するのに使用されます。
  • Python で空リストを作成するのに、角括弧 [] がよく使用されますが、それは構文がより簡潔で高速だからです。

🔸効率性

ちょっと待ってください!私はたった今 []list() よりも高速であるとお伝えしましたね...

では速さはどれくらいでしょうか?

timeit モジュールを使用してこれらの時間効率をチェックしてみましょう。

このモジュールを Python のプログラム内で使用するには、モジュールをインポートする必要があります:

>>> import timeit

具体的には、次の構文を用いて呼び出せる、このモジュールの timeit 関数 を使用します:

timeit-function-syntax

💡ヒント: テストしたいコードを何回も繰り返し実行することで、その瞬間に実行される、他の処理などの外部要因によって起こりうる時間差を減らしています。こうすることで、比較されるテストの結果がより信頼できるものになります。

🚦では位置について ... 用意 ... ドン!テストコードとその実行結果についてこれから解説します:

まずは、モジュールをインポートします。

>>> import timeit

次に各構文のテストを開始します。

[] のテスト:

>>> timeit.timeit('[]', number=10**4)
0.0008467000000109692

list() のテスト:

>>> timeit.timeit('list()', number=10**4)
0.002867799999989984

💡ヒント: 実行時間を計ろうとしているコードは、シングルクォーテーション '' またはダブルクォーテーション "" で囲む必要があるということに注意してください。timeit 関数が返す計測時間は秒で表されます。

2 つの結果を比較してみましょう:

  • []: 0.0008467000000109692
  • list(): 0.002867799999989984

[]list() よりもかなり速いことが確認できますね。このテストではおよそ 0.002 秒の違いがありました:

>>> 0.002867799999989984 - 0.0008467000000109692
0.0020210999999790147

ここで次のような疑問をお持ちになることでしょう: 全く同じ処理を行っているのに、なぜ list()[] ほど効率的ではないのでしょうか?

そうですね... list() がより遅いのは、関数の名前を検索し、呼び出してから、メモリ内にリストオブジェクトを作成する必要があるからです。それに対して、[] はメモリ内にリストを作成するためにそれほど多くの中間ステップを必要としない、「ショートカット」のようなものです。

この時間差はプログラムの性能にあまり影響を及ぼしませんが、どちらがより効率的であるかを、また背後でどのように動作しているのかを知っておくと便利です。

🔹まとめ

空の角括弧のペア [] を使用して、もしくは引数が渡されない場合に空リストを作成する組み込み関数の型コンストラクタ list() を使用して、空リストを作成できるようになりましたね。

角括弧 [] は、空リストを高速に、より簡潔に作成できるので、Python ではよく用いられます。

この記事があなたのお役に立ち、気に入っていただければ幸いです。これで、Python のプロジェクト内で空リストを作成できるようになりましたね。もしよろしければ私 (原著者) のオンライン講座をチェックしてみてください。Twitter のフォローもよろしくお願いします。⭐️

もしリストについてさらに深く掘り下げたい場合は、以下の記事も気に入っていただけるかもしれません: