HOWTO · Python
Python で 0 で初期化したリストを作成する
このチュートリアルでは、Python でゼロを含むリストを生成する方法を紹介します。リスト内包表記、乗算演算子、numpy ライブラリの使用など、さまざまな方法を取り上げます。初心者でも経験豊富なプログラマーでも、このガイドの明確なコード例と説明が、プロジェクトに合わせたゼロのリストを効率的に作成する助けになります。
このページの内容
要素数が n のゼロ入りPythonリストを作るには、[0] * n を使います。たとえば [0] * 5 は、整数の 0 が5個入ったリストを作ります。必要な長さが決まっていて、すべての要素が同じ値なら、この方法が最もわかりやすい選択肢です。以下では方法を比較しやすいよう、すべて n = 5 としています。
固定長のゼロリストにはリストの乗算を使う
リストの乗算は、左辺のリストにある要素を繰り返します。[0] には整数が1つ入っているため、これを n 倍すると整数の 0 が n 個できます。
n = 5
zeros = [0] * n
結果は新しいリストです。回数が0なら [] になり、負の回数でも [] になります。Pythonでは、シーケンスを0以下の回数だけ繰り返しても、空のシーケンスになるためです。この例で繰り返す値は整数なので、リストの各位置に別々の値を代入できます。一方、入れ子のリストなど変更可能なオブジェクトを繰り返すと、各位置が同じオブジェクトを参照します。別々のオブジェクトを作るには、内包表記を使ってください。
リスト内包表記でゼロのリストを作る
リスト内包表記は、反復可能オブジェクトの各要素について式を1回ずつ評価します。ここでは range(n) によって5回反復し、式では使わないループ値に _ という名前を付けています。角括弧で囲まれたこの式が、リスト内包表記です。
n = 5
zeros = [0 for _ in range(n)]
反復ごとに値を計算する場合や、生成ルールをコード上ではっきり示したい場合は、この書き方が便利です。ここではループ値を使わないため、慣例として _ を使っています。Pythonで _ に特別な動作があるわけではありません。要素ごとに異なる値を計算するなら、0 を反復値に応じた式に置き換えられます。
値ごとに独自の処理が必要ならループを使う
各要素を作る際に複数の文や条件、別の処理が必要なら、明示的なループが便利です。反復のたびに値を1つ追加します。
n = 5
zeros = []
for _ in range(n):
zeros.append(0)
この方法でも、リストの乗算や内包表記と同じ組み込みのリストができます。整数を単純に繰り返すだけなら、ほかの2つの方法のほうが短く書けます。各要素に対する処理をループ本体に書くほうがわかりやすい場合に、ループを使いましょう。実際のプログラムでは、各値の計算や準備に必要な処理を append(0) の部分に記述します。
itertools.repeat()でゼロを繰り返す
itertools.repeat() は同じオブジェクトを繰り返し返します。値と回数を指定し、リストが必要なら、そのイテレーターを list() に渡します。
from itertools import repeat
n = 5
zeros = list(repeat(0, n))
イテレーターをそのまま使いたい場合や、値を繰り返すイテレーターを別の処理に組み込みたい場合に便利です。list(...) はイテレーターの値をすべて取り出してメモリ上に保存します。そのため、最初からリストが必要なら、通常は [0] * n のほうが簡潔です。
数値配列が必要ならNumPyを使う
NumPyの演算を使う数値処理では、numpy.zeros(n) によって、値がすべて0の要素 n 個からなるNumPy配列を作れます。たとえばNumPyをインストールした環境で import numpy as np に続けて zeros = np.zeros(5) とすると、配列が作られます。結果は組み込みのPythonリストではなく ndarray です。コードの別の部分でリストが必要な場合に限り、zeros.tolist() で変換してください。NumPyは追加の依存関係であり、配列演算、形状、データ型が必要な場合に役立ちます。通常のリストなら、依存関係を追加せずに [0] * n を使えます。
単純な固定長リストには乗算、要素ごとに式を評価するなら内包表記、独自の処理が必要ならループ、イテレーターが便利なら itertools.repeat()、配列を使うならNumPyを選びましょう。