「リストの特定の値だけを書き換えたい」
「まとめて複数の値を置き換えたい」
「条件に応じて柔軟に変更したい」
そんな疑問を解決するために、今回はリストの要素を変更する方法について、初心者の方でも理解できるように詳しく説明していきます。
まずはリストの基本をおさらい

pythonのリストがどう構成されているかを確認しておきましょう。
リストの基本構造
# リストの作成
fruits = ["りんご", "バナナ", "みかん", "ぶどう"]
print(fruits) # ['りんご', 'バナナ', 'みかん', 'ぶどう']
# インデックス(番号)でアクセス
print(fruits[0]) # りんご (0番目)
print(fruits[1]) # バナナ (1番目)
print(fruits[2]) # みかん (2番目)
print(fruits[3]) # ぶどう (3番目)
負のインデックスも使える
fruits = ["りんご", "バナナ", "みかん", "ぶどう"]
print(fruits[-1]) # ぶどう (最後の要素)
print(fruits[-2]) # みかん (後ろから2番目)
print(fruits[-3]) # バナナ (後ろから3番目)
print(fruits[-4]) # りんご (後ろから4番目)
単一要素の変更方法
最も基本的な操作は、特定のインデックスの値を直接書き換えることです。
リスト[インデックス] = 値
基本的な変更方法
fruits = ["りんご", "バナナ", "みかん", "ぶどう"]
print("変更前:", fruits) # ['りんご', 'バナナ', 'みかん', 'ぶどう']
# 1番目の要素(バナナ)を変更
fruits[1] = "いちご"
print("変更後:", fruits) # ['りんご', 'いちご', 'みかん', 'ぶどう']
# 最後の要素を変更
fruits[-1] = "メロン"
print("最終結果:", fruits) # ['りんご', 'いちご', 'みかん', 'メロン']
複数の要素を個別に変更
numbers = [10, 20, 30, 40, 50]
print("変更前:", numbers) # [10, 20, 30, 40, 50]
# 複数の要素を個別に変更
numbers[0] = 100
numbers[2] = 300
numbers[4] = 500
print("変更後:", numbers) # [100, 20, 300, 40, 500]
よくある間違い:範囲外インデックス
fruits = ["りんご", "バナナ", "みかん"]
# 間違い:存在しないインデックス
# fruits[3] = "メロン" # IndexError: list index out of range
# 正しい:事前に長さを確認
if len(fruits) > 3:
fruits[3] = "メロン"
else:
print(f"インデックス3は存在しません。リストの長さ: {len(fruits)}")
スライスを使った複数要素の変更
スライス(slice)を使えば、複数の要素をまとめて置き換えることができます。
基本的なスライス変更
fruits = ["りんご", "バナナ", "みかん", "ぶどう", "もも"]
print("変更前:", fruits)
# 最初の2つを変更
fruits[:2] = ["スイカ", "メロン"]
print("変更後:", fruits) # ['スイカ', 'メロン', 'みかん', 'ぶどう', 'もも']
# 1番目から3番目まで変更
fruits[1:4] = ["キウイ", "パイナップル"]
print("最終結果:", fruits) # ['スイカ', 'キウイ', 'パイナップル', 'もも']
サイズが異なる要素での置き換え
numbers = [1, 2, 3, 4, 5]
print("変更前:", numbers) # [1, 2, 3, 4, 5]
# 3つの要素を1つに置き換え
numbers[1:4] = [100]
print("変更後:", numbers) # [1, 100, 5]
# 1つの要素を複数に置き換え
numbers[1:2] = [200, 300, 400]
print("最終結果:", numbers) # [1, 200, 300, 400, 5]
ステップを指定した変更
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("変更前:", numbers)
# 2個おきの要素を変更
numbers[::2] = [10, 12, 14, 16, 18]
print("変更後:", numbers) # [10, 1, 12, 3, 14, 5, 16, 7, 18, 9]
# 特定範囲の2個おきを変更
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers[1:8:2] = [11, 13, 15, 17]
print("範囲指定変更:", numbers) # [0, 11, 2, 13, 4, 15, 6, 17, 8, 9]
条件付きでリストの要素を変更する方法

特定の条件を満たす要素だけを変更したい場合の方法です。
for文とif文を使った変更
fruits = ["りんご", "バナナ", "みかん", "バナナ", "ぶどう"]
print("変更前:", fruits)
# すべての「バナナ」を「マンゴー」に変更
for i in range(len(fruits)):
if fruits[i] == "バナナ":
fruits[i] = "マンゴー"
print("変更後:", fruits) # ['りんご', 'マンゴー', 'みかん', 'マンゴー', 'ぶどう']
enumerateを使った変更
scores = [85, 92, 76, 88, 95, 73]
print("変更前:", scores)
# 80点未満を80点に変更
for i, score in enumerate(scores):
if score < 80:
scores[i] = 80
print("変更後:", scores) # [85, 92, 80, 88, 95, 80]
リスト内包表記を使った変更
# 新しいリストを作成する場合
temperatures = [18, 25, 32, 19, 28, 35]
print("変更前:", temperatures)
# 30度以上を「暑い」、それ以外を「普通」に変更
weather = ["暑い" if temp >= 30 else "普通" for temp in temperatures]
print("変更後:", weather) # ['普通', '普通', '暑い', '普通', '普通', '暑い']
# 元のリストを置き換える場合
temperatures[:] = [temp if temp < 30 else 30 for temp in temperatures]
print("温度調整後:", temperatures) # [18, 25, 30, 19, 28, 30]
複雑な条件での変更
students = [
{"name": "太郎", "score": 85},
{"name": "花子", "score": 92},
{"name": "次郎", "score": 76},
{"name": "美香", "score": 88}
]
print("変更前:")
for student in students:
print(f"{student['name']}: {student['score']}点")
# 80点未満の学生のスコアを80点に変更
for student in students:
if student["score"] < 80:
student["score"] = 80
print("\n変更後:")
for student in students:
print(f"{student['name']}: {student['score']}点")
特定の値を検索して変更する
indexメソッドを使った変更
colors = ["赤", "青", "緑", "青", "黄"]
print("変更前:", colors)
# 最初に見つかった「青」を「紫」に変更
try:
index = colors.index("青")
colors[index] = "紫"
print("変更後:", colors) # ['赤', '紫', '緑', '青', '黄']
except ValueError:
print("指定した値が見つかりませんでした")
すべての該当する値を変更
def replace_all(lst, old_value, new_value):
"""リスト内のすべての指定値を新しい値に変更"""
for i in range(len(lst)):
if lst[i] == old_value:
lst[i] = new_value
colors = ["赤", "青", "緑", "青", "黄", "青"]
print("変更前:", colors)
replace_all(colors, "青", "紫")
print("変更後:", colors) # ['赤', '紫', '緑', '紫', '黄', '紫']
要素の変更で注意すべきポイント

ミュータブルとイミュータブルの違い
# リスト(ミュータブル:変更可能)
my_list = [1, 2, 3]
my_list[0] = 100 # OK
print(my_list) # [100, 2, 3]
# タプル(イミュータブル:変更不可)
my_tuple = (1, 2, 3)
# my_tuple[0] = 100 # TypeError: 'tuple' object does not support item assignment
# 文字列(イミュータブル:変更不可)
my_string = "hello"
# my_string[0] = "H" # TypeError: 'str' object does not support item assignment
参照による影響
# 同じリストを参照している場合
original = [1, 2, 3, 4, 5]
reference = original # 同じオブジェクトを参照
reference[0] = 100
print("original:", original) # [100, 2, 3, 4, 5] ← 変更される
print("reference:", reference) # [100, 2, 3, 4, 5]
# コピーを作成する場合
original = [1, 2, 3, 4, 5]
copy_list = original.copy() # または original[:] や list(original)
copy_list[0] = 200
print("original:", original) # [1, 2, 3, 4, 5] ← 変更されない
print("copy_list:", copy_list) # [200, 2, 3, 4, 5]
ネストされたリスト(2次元リスト)での変更
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print("変更前:")
for row in matrix:
print(row)
# 特定の要素を変更
matrix[1][2] = 100 # 2行目の3列目を変更
print("\n変更後:")
for row in matrix:
print(row)
# [1, 2, 3]
# [4, 5, 100]
# [7, 8, 9]
# 行全体を変更
matrix[0] = [10, 20, 30]
print("\n行全体変更後:")
for row in matrix:
print(row)
# [10, 20, 30]
# [4, 5, 100]
# [7, 8, 9]
ネストされたリストのコピー問題
# 浅いコピーの問題
original = [[1, 2], [3, 4]]
shallow_copy = original.copy()
shallow_copy[0][0] = 100
print("original:", original) # [[100, 2], [3, 4]] ← 内部も変更される
print("shallow_copy:", shallow_copy) # [[100, 2], [3, 4]]
# 深いコピーの解決法
import copy
original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(original)
deep_copy[0][0] = 200
print("original:", original) # [[1, 2], [3, 4]] ← 変更されない
print("deep_copy:", deep_copy) # [[200, 2], [3, 4]]
実践的な使用例

データの正規化
def normalize_data(data, min_val=0, max_val=100):
"""データを指定した範囲に正規化する"""
if not data:
return
current_min = min(data)
current_max = max(data)
range_current = current_max - current_min
range_target = max_val - min_val
for i in range(len(data)):
if range_current != 0:
normalized = (data[i] - current_min) / range_current * range_target + min_val
data[i] = round(normalized, 2)
# 使用例
scores = [65, 78, 92, 45, 88, 76, 95]
print("正規化前:", scores)
normalize_data(scores)
print("正規化後:", scores)
不正データの修正
def clean_data(data):
"""データのクリーニングを行う"""
for i in range(len(data)):
# 負の値を0に変更
if isinstance(data[i], (int, float)) and data[i] < 0:
data[i] = 0
# 空文字列を"不明"に変更
if data[i] == "":
data[i] = "不明"
# Noneを"データなし"に変更
if data[i] is None:
data[i] = "データなし"
# 使用例
messy_data = [10, -5, "", 20, None, 15, -2]
print("クリーニング前:", messy_data)
clean_data(messy_data)
print("クリーニング後:", messy_data)
バッチ更新処理
def batch_update(products, discount_rate):
"""商品リストの価格を一括で割引する"""
for product in products:
if "price" in product:
original_price = product["price"]
discounted_price = original_price * (1 - discount_rate)
product["price"] = round(discounted_price)
product["original_price"] = original_price
# 使用例
products = [
{"name": "商品A", "price": 1000},
{"name": "商品B", "price": 1500},
{"name": "商品C", "price": 800}
]
print("割引前:")
for product in products:
print(f"{product['name']}: {product['price']}円")
batch_update(products, 0.2) # 20%割引
print("\n20%割引後:")
for product in products:
print(f"{product['name']}: {product['price']}円 (元価格: {product['original_price']}円)")
よくある質問
- Qリストの要素を変更した時、元のデータは保持される?
- A
リスト自体は変更されますが、
copy()
や[:]
でコピーを作ってから変更すれば元のデータを保持できます。
- Q文字列の中の一部を変更するには?
- A
文字列はイミュータブルなので直接変更できません。
replace()
メソッドやスライスを使って新しい文字列を作ります。text = "Hello World"
# text[0] = "h" # エラー
new_text = "h" + text[1:] # "hello World"
- Q大きなリストの要素を効率的に変更するには?
- A
NumPyを使うと数値計算が高速になります。
import numpy as np
# 通常のリスト
data = [1, 2, 3, 4, 5] * 100000
for i in range(len(data)):
data[i] *= 2
# NumPy配列(高速)
np_data = np.array([1, 2, 3, 4, 5] * 100000)
np_data *= 2
- Qリストの一部だけを条件付きで変更するには?
- A
リスト内包表記と三項演算子を組み合わせると簡潔に書けます。
data = [1, 2, 3, 4, 5]
data[:] = [x * 2 if x % 2 == 0 else x for x in data]
print(data) # [1, 4, 3, 8, 5]
まとめ
pythonのリスト要素変更は、データ処理の基本中の基本でありながら、実務でも非常に重要なスキルです。
おさらい:
- 単一要素変更:
list[index] = 新しい値
- 複数要素変更:スライスを使った一括変更
- 条件付き変更:for文やリスト内包表記での柔軟な変更
- 注意点:参照問題、ネストされたリストでの深いコピーなど
コメント