Pythonリスト初期化完全ガイド:任意の値・要素数で効率的に作成する方法

 

はじめに

Pythonプログラミングにおいて、リストを特定の値や要素数で初期化することは頻繁に行う作業です。空のリストから要素を追加していく方法もありますが、あらかじめサイズや初期値が決まっている場合は、効率的な初期化方法を知っておくことで、コードがより簡潔で高速になります。

基本的なリスト初期化方法

空リストの作成

# 基本的な空リスト
empty_list = []
empty_list2 = list()

print(empty_list)   # []
print(empty_list2)  # []

値を指定した初期化

# 具体的な値で初期化
numbers = [1, 2, 3, 4, 5]
colors = ["赤", "青", "緑"]
mixed = [1, "hello", 3.14, True]

print(numbers)  # [1, 2, 3, 4, 5]

同じ値で複数要素を初期化

* 演算子を使用

# 同じ値で指定した数だけ初期化
zeros = [0] * 5
ones = [1] * 3
text = ["hello"] * 4

print(zeros)  # [0, 0, 0, 0, 0]
print(ones)   # [1, 1, 1]
print(text)   # ['hello', 'hello', 'hello', 'hello']

Noneで初期化

# Noneで初期化(後で値を設定する場合)
placeholder = [None] * 10
print(placeholder)  # [None, None, None, None, None, None, None, None, None, None]

# 後で値を設定
placeholder[0] = "first"
placeholder[5] = "sixth"
print(placeholder)  # ['first', None, None, None, None, 'sixth', None, None, None, None]

range()を使った初期化

連続する数値での初期化

# 0から始まる連続数値
numbers1 = list(range(5))
print(numbers1)  # [0, 1, 2, 3, 4]

# 指定した範囲の数値
numbers2 = list(range(1, 6))
print(numbers2)  # [1, 2, 3, 4, 5]

# ステップを指定
even_numbers = list(range(0, 10, 2))
print(even_numbers)  # [0, 2, 4, 6, 8]

逆順での初期化

# 逆順の数値リスト
reverse_nums = list(range(10, 0, -1))
print(reverse_nums)  # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

# 偶数の逆順
reverse_even = list(range(10, 0, -2))
print(reverse_even)  # [10, 8, 6, 4, 2]

リスト内包表記による初期化

基本的なリスト内包表記

# 二乗数のリスト
squares = [x**2 for x in range(5)]
print(squares)  # [0, 1, 4, 9, 16]

# 文字列の加工
greetings = [f"Hello, {name}!" for name in ["Alice", "Bob", "Charlie"]]
print(greetings)  # ['Hello, Alice!', 'Hello, Bob!', 'Hello, Charlie!']

条件付きリスト内包表記

# 偶数のみ
evens = [x for x in range(10) if x % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

# 条件に応じた値の変更
values = [x if x > 0 else 0 for x in range(-3, 4)]
print(values)  # [0, 0, 0, 0, 1, 2, 3]

多次元リストの初期化

2次元リストの作成

# 3x3のゼロ行列
matrix = [[0] * 3 for _ in range(3)]
print(matrix)  # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

# 異なる値での初期化
matrix2 = [[i + j for j in range(3)] for i in range(3)]
print(matrix2)  # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]

注意:間違った多次元リスト作成

# 間違った方法(同じリストオブジェクトを参照)
wrong_matrix = [[0] * 3] * 3
wrong_matrix[0][0] = 1
print(wrong_matrix)  # [[1, 0, 0], [1, 0, 0], [1, 0, 0]]

# 正しい方法
correct_matrix = [[0] * 3 for _ in range(3)]
correct_matrix[0][0] = 1
print(correct_matrix)  # [[1, 0, 0], [0, 0, 0], [0, 0, 0]]

特定のパターンでの初期化

交互の値

# True/Falseの交互パターン
alternating = [i % 2 == 0 for i in range(10)]
print(alternating)  # [True, False, True, False, True, False, True, False, True, False]

# 数値の交互パターン
pattern = [1 if i % 2 == 0 else -1 for i in range(8)]
print(pattern)  # [1, -1, 1, -1, 1, -1, 1, -1]

繰り返しパターン

# 複数の値を繰り返し
colors = ["赤", "青", "緑"]
repeated_colors = [colors[i % 3] for i in range(10)]
print(repeated_colors)  # ['赤', '青', '緑', '赤', '青', '緑', '赤', '青', '緑', '赤']

関数を使った初期化

map()関数の使用

# 文字列を数値に変換
str_numbers = ["1", "2", "3", "4", "5"]
int_numbers = list(map(int, str_numbers))
print(int_numbers)  # [1, 2, 3, 4, 5]

# 関数を適用
import math
radians = [0, math.pi/4, math.pi/2, 3*math.pi/4, math.pi]
sin_values = list(map(math.sin, radians))
print([round(x, 2) for x in sin_values])  # [0.0, 0.71, 1.0, 0.71, 0.0]

カスタム関数での初期化

def generate_fibonacci(n):
    if n <= 0:
        return []
    elif n == 1:
        return [0]
    elif n == 2:
        return [0, 1]
    
    fib = [0, 1]
    for i in range(2, n):
        fib.append(fib[i-1] + fib[i-2])
    return fib

fibonacci_list = generate_fibonacci(8)
print(fibonacci_list)  # [0, 1, 1, 2, 3, 5, 8, 13]

実用的な初期化例

1. 学生の成績管理

# 学生数30人、科目数5つの成績表
student_count = 30
subject_count = 5
grades = [[0] * subject_count for _ in range(student_count)]

# 特定の学生の成績を設定
grades[0] = [85, 90, 78, 92, 88]  # 1番目の学生
print(f"学生1の成績: {grades[0]}")

2. カレンダーの日付管理

# 12ヶ月の日数(平年)
days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

# 各月の週数を計算(簡易版)
weeks_per_month = [(days + 6) // 7 for days in days_in_month]
print(weeks_per_month)  # [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

3. ゲームのスコア管理

# プレイヤー4人、ラウンド10回のスコア
players = 4
rounds = 10
scores = [[0] * rounds for _ in range(players)]

# 1ラウンド目のスコアを設定
for player in range(players):
    scores[player][0] = (player + 1) * 10

print("1ラウンド目のスコア:")
for i, score in enumerate(scores):
    print(f"プレイヤー{i+1}: {score[0]}")

4. センサーデータの初期化

# 24時間分の温度データ(初期値は None)
temperature_data = [None] * 24

# いくつかの時間帯のデータを設定
temperature_data[9] = 22.5   # 9時
temperature_data[12] = 25.8  # 12時
temperature_data[18] = 23.1  # 18時

# データが設定されている時間帯をチェック
recorded_hours = [i for i, temp in enumerate(temperature_data) if temp is not None]
print(f"記録済み時間帯: {recorded_hours}")  # [9, 12, 18]

パフォーマンスの比較

初期化方法の速度比較

import time

size = 100000

# 方法1: append()で追加
start = time.time()
list1 = []
for i in range(size):
    list1.append(0)
time1 = time.time() - start

# 方法2: * 演算子
start = time.time()
list2 = [0] * size
time2 = time.time() - start

# 方法3: リスト内包表記
start = time.time()
list3 = [0 for _ in range(size)]
time3 = time.time() - start

print(f"append(): {time1:.4f}s")
print(f"* operator: {time2:.4f}s")
print(f"list comprehension: {time3:.4f}s")

一般的に*演算子が最も高速で、次にリスト内包表記、最後にappend()の順になります。

よくある間違いとその対策

1. 可変オブジェクトの参照問題

# 間違い:すべて同じリストを参照
wrong = [[]] * 3
wrong[0].append(1)
print(wrong)  # [[1], [1], [1]]

# 正解:それぞれ異なるリストを作成
correct = [[] for _ in range(3)]
correct[0].append(1)
print(correct)  # [[1], [], []]

2. 大きなリストでのメモリ使用

# メモリ効率を考慮
# 大きなリストが必要な場合はgeneratorを検討
def large_data_generator(size):
    for i in range(size):
        yield i * 2

# 必要な分だけ取得
data = list(large_data_generator(10))
print(data[:5])  # [0, 2, 4, 6, 8]

3. 型の統一性

# 数値計算では型を統一
# 混在を避ける
numbers = [1, 2.0, 3]  # int と float が混在

# 統一する
numbers_float = [float(x) for x in [1, 2, 3]]
print(numbers_float)  # [1.0, 2.0, 3.0]

高度な初期化テクニック

1. 条件に応じた動的初期化

def create_list(size, fill_type="zero"):
    if fill_type == "zero":
        return [0] * size
    elif fill_type == "sequence":
        return list(range(size))
    elif fill_type == "random":
        import random
        return [random.randint(1, 100) for _ in range(size)]
    else:
        return [None] * size

# 使用例
zero_list = create_list(5, "zero")
seq_list = create_list(5, "sequence")
print(zero_list)  # [0, 0, 0, 0, 0]
print(seq_list)   # [0, 1, 2, 3, 4]

2. クラスのインスタンスリスト

class Student:
    def __init__(self, name, grade=0):
        self.name = name
        self.grade = grade

# 学生オブジェクトのリスト
students = [Student(f"学生{i+1}") for i in range(5)]

# 名前を確認
names = [student.name for student in students]
print(names)  # ['学生1', '学生2', '学生3', '学生4', '学生5']

3. ネストした構造の初期化

# 3次元配列(深さ2, 高さ3, 幅4)
array_3d = [[[0 for _ in range(4)] for _ in range(3)] for _ in range(2)]
print(f"Shape: {len(array_3d)} x {len(array_3d[0])} x {len(array_3d[0][0])}")

# 値を設定
array_3d[0][1][2] = 42
print(f"array_3d[0][1][2] = {array_3d[0][1][2]}")

使い分けの指針

選択基準

# サイズが小さく、同じ値 → * 演算子
small_same = [0] * 10

# サイズが大きく、同じ値 → * 演算子(最高速)
large_same = [None] * 100000

# 計算が必要 → リスト内包表記
calculated = [x**2 for x in range(100)]

# 複雑な条件 → リスト内包表記 or 関数
complex_list = [process(x) for x in data if condition(x)]

# 多次元 → リスト内包表記(入れ子)
matrix = [[0 for _ in range(cols)] for _ in range(rows)]

まとめ

Pythonリストの初期化方法の要点:

基本的な方法:

  • [] または list() – 空リスト
  • [値] * 数 – 同じ値で複数要素
  • list(range()) – 連続数値

効率的な方法:

  • *演算子 – 同じ値の大量初期化に最適
  • リスト内包表記 – 計算や条件が必要な場合
  • map()関数 – 既存データの変換

多次元リスト:

  • [[値] * 列数 for _ in range(行数)] – 正しい方法
  • [[値] * 列数] * 行数 – 避けるべき(参照問題)

選択指針:

  1. 単純な同値初期化*演算子
  2. 計算が必要 → リスト内包表記
  3. 既存データ変換map()関数
  4. 多次元データ → ネストしたリスト内包表記

適切な初期化方法を選択することで、コードの可読性とパフォーマンスの両方を向上させることができます。

関連記事

  • Pythonリスト操作完全ガイド
  • リスト内包表記の使い方とテクニック
  • NumPy配列との使い分け方法

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座