【Python extend完全ガイド】appendとの違いから応用テクニックまで徹底解説 – 2025年最新版
Pythonでリストを効率的に操作するために、**extend()**メソッドは欠かせない重要な機能です。この記事では、extendの基本的な使い方から、appendとの違い、実践的な応用テクニックまで、豊富なサンプルコードとともに詳しく解説します。
📋 目次
🎯 extendとは
**extend()**は、Pythonのリストオブジェクトに別のイテラブル(反復可能)オブジェクトの全要素を末尾に追加するメソッドです。複数の要素を一度に追加したい場合に非常に便利で、リストの結合や拡張において中心的な役割を果たします。
基本構文
list.extend(iterable)
🚀 基本的な使い方
1. リスト同士の結合
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1) # [1, 2, 3, 4, 5, 6]
2. 文字列の展開
letters = ['a', 'b']
letters.extend('cd')
print(letters) # ['a', 'b', 'c', 'd']
3. タプルの展開
numbers = [1, 2]
numbers.extend((3, 4, 5))
print(numbers) # [1, 2, 3, 4, 5]
4. 空リストの場合
empty_list = []
empty_list.extend([1, 2, 3])
print(empty_list) # [1, 2, 3]
⚖️ appendとの決定的な違い
appendの動作
# append: 要素を1つのオブジェクトとして追加
list1 = [1, 2, 3]
list1.append([4, 5, 6])
print(list1) # [1, 2, 3, [4, 5, 6]] - ネストしたリスト
extendの動作
# extend: 要素を展開して個別に追加
list2 = [1, 2, 3]
list2.extend([4, 5, 6])
print(list2) # [1, 2, 3, 4, 5, 6] - フラットなリスト
視覚的な比較
# データの準備
base = [1, 2]
add_data = [3, 4]
# append使用
list_append = base.copy()
list_append.append(add_data)
print("append:", list_append) # [1, 2, [3, 4]]
# extend使用
list_extend = base.copy()
list_extend.extend(add_data)
print("extend:", list_extend) # [1, 2, 3, 4]
📚 extendが受け取れるデータ型
1. リスト
original = [1, 2]
original.extend([3, 4, 5])
print(original) # [1, 2, 3, 4, 5]
2. 文字列
chars = ['a', 'b']
chars.extend("hello")
print(chars) # ['a', 'b', 'h', 'e', 'l', 'l', 'o']
3. タプル
numbers = [1, 2]
numbers.extend((3, 4))
print(numbers) # [1, 2, 3, 4]
4. セット
data = [1, 2]
data.extend({3, 4, 5})
print(data) # [1, 2, 3, 4, 5] (順序は保証されない)
5. 辞書(キーのみ)
items = ['a', 'b']
items.extend({'x': 1, 'y': 2})
print(items) # ['a', 'b', 'x', 'y']
6. ジェネレータ
def number_gen():
for i in range(3, 6):
yield i
nums = [1, 2]
nums.extend(number_gen())
print(nums) # [1, 2, 3, 4, 5]
💼 実践的な活用例
1. ファイルの行結合
all_lines = []
filenames = ['file1.txt', 'file2.txt', 'file3.txt']
for filename in filenames:
with open(filename, 'r') as f:
lines = f.readlines()
all_lines.extend(lines)
print(f"総行数: {len(all_lines)}")
2. 複数の条件での検索結果統合
def search_by_category(data, category):
return [item for item in data if item['category'] == category]
all_products = []
categories = ['electronics', 'books', 'clothing']
for category in categories:
products = search_by_category(inventory, category)
all_products.extend(products)
3. 数値データの統合処理
# 複数のデータソースから数値を収集
results = []
data_sources = [
[1, 2, 3],
range(4, 7),
(7, 8, 9),
{10, 11, 12}
]
for source in data_sources:
results.extend(source)
print(results) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
4. 設定ファイルのマージ
default_config = ['debug=false', 'port=8080']
user_config = ['theme=dark', 'language=ja']
env_config = ['max_connections=100']
final_config = []
final_config.extend(default_config)
final_config.extend(user_config)
final_config.extend(env_config)
print(final_config)
5. バッチ処理での結果蓄積
def process_batch(items):
return [item * 2 for item in items]
all_results = []
batches = [[1, 2], [3, 4], [5, 6]]
for batch in batches:
batch_results = process_batch(batch)
all_results.extend(batch_results)
print(all_results) # [2, 4, 6, 8, 10, 12]
📊 パフォーマンス比較と最適化
extend vs 繰り返しappend
import time
# 繰り返しappend(非効率)
def append_method(data):
result = []
for item in data:
result.append(item)
return result
# extend使用(効率的)
def extend_method(data):
result = []
result.extend(data)
return result
# パフォーマンステスト
large_data = list(range(100000))
start = time.time()
result1 = append_method(large_data)
time1 = time.time() - start
start = time.time()
result2 = extend_method(large_data)
time2 = time.time() - start
print(f"append方式: {time1:.4f}秒")
print(f"extend方式: {time2:.4f}秒") # 通常より高速
extend vs + 演算子
# + 演算子(新しいリスト作成)
list1 = [1, 2, 3]
list2 = [4, 5, 6]
result = list1 + list2 # 新しいリスト
print("元のリスト:", list1) # [1, 2, 3] - 変更なし
# extend(元のリスト変更)
list3 = [1, 2, 3]
list3.extend([4, 5, 6])
print("extend後:", list3) # [1, 2, 3, 4, 5, 6]
メモリ効率の比較
# メモリ効率的なパターン
def efficient_combine(*lists):
result = []
for lst in lists:
result.extend(lst)
return result
# 非効率なパターン
def inefficient_combine(*lists):
result = []
for lst in lists:
result = result + lst # 毎回新しいリスト作成
return result
🚨 よくあるエラーと対処法
1. TypeError: ‘int’ object is not iterable
# ❌ エラーの原因
numbers = [1, 2]
numbers.extend(3) # エラー!整数は反復不可
# ✅ 正しい書き方
numbers = [1, 2]
numbers.extend([3]) # リストで囲む
# または
numbers.append(3) # 単一要素はappend
2. 意図しないネストの発生
# ❌ 問題のあるコード
data = [[1, 2], [3, 4]]
result = []
for sublist in data:
result.extend(sublist) # これは意図的?
print(result) # [1, 2, 3, 4] - フラット化される
# ✅ ネストを保持したい場合
result = []
for sublist in data:
result.append(sublist)
print(result) # [[1, 2], [3, 4]]
3. 元のリストの意図しない変更
# ❌ 問題のあるコード
def combine_lists(list1, list2):
list1.extend(list2) # list1が変更される
return list1
original = [1, 2, 3]
result = combine_lists(original, [4, 5])
print(original) # [1, 2, 3, 4, 5] - 変更されてしまう
# ✅ 安全なコード
def combine_lists(list1, list2):
result = list1.copy()
result.extend(list2)
return result
🎨 高度な応用テクニック
1. 条件付きextend
def conditional_extend(target, source, condition):
if condition:
target.extend(source)
return target
data = [1, 2, 3]
conditional_extend(data, [4, 5], True) # 追加される
conditional_extend(data, [6, 7], False) # 追加されない
print(data) # [1, 2, 3, 4, 5]
2. フィルタリングしながらextend
def filtered_extend(target, source, filter_func):
filtered_items = [item for item in source if filter_func(item)]
target.extend(filtered_items)
return target
numbers = [1, 2]
source = [3, 4, 5, 6, 7, 8]
filtered_extend(numbers, source, lambda x: x % 2 == 0)
print(numbers) # [1, 2, 4, 6, 8]
3. ジェネレータとの組み合わせ
def fibonacci_gen(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
fib_numbers = [0, 1]
fib_numbers.extend(fibonacci_gen(8))
print(fib_numbers) # [0, 1, 0, 1, 1, 2, 3, 5, 8, 13]
4. クラスでの動的リスト管理
class DataAggregator:
def __init__(self):
self.data = []
def add_batch(self, items):
self.data.extend(items)
return len(self.data)
def add_from_file(self, filename):
with open(filename, 'r') as f:
lines = [line.strip() for line in f]
self.data.extend(lines)
def get_data(self):
return self.data.copy()
aggregator = DataAggregator()
aggregator.add_batch([1, 2, 3])
print(f"データ数: {len(aggregator.get_data())}")
5. 型安全なextend
def type_safe_extend(target, source, expected_type):
validated_items = []
for item in source:
if isinstance(item, expected_type):
validated_items.append(item)
else:
print(f"警告: {item}は{expected_type}ではありません")
target.extend(validated_items)
return target
numbers = [1, 2, 3]
mixed_data = [4, "5", 6, "seven", 8]
type_safe_extend(numbers, mixed_data, int)
print(numbers) # [1, 2, 3, 4, 6, 8]
📈 extendを使った実用的なパターン
1. ログエントリの統合
class LogManager:
def __init__(self):
self.logs = []
def merge_logs(self, *log_sources):
for source in log_sources:
self.logs.extend(source)
self.logs.sort(key=lambda x: x['timestamp'])
def get_logs(self):
return self.logs
log_manager = LogManager()
error_logs = [{'timestamp': '2025-01-01', 'level': 'ERROR'}]
info_logs = [{'timestamp': '2025-01-02', 'level': 'INFO'}]
log_manager.merge_logs(error_logs, info_logs)
2. 設定のカスケード
def build_config(*config_sources):
final_config = []
for source in config_sources:
if isinstance(source, dict):
final_config.extend(source.items())
else:
final_config.extend(source)
return dict(final_config)
default = {'debug': False, 'port': 8080}
user = {'theme': 'dark'}
env = [('max_memory', '2GB'), ('timeout', 30)]
config = build_config(default, user, env)
3. データパイプライン
def create_pipeline(*processors):
def pipeline(data):
result = []
for processor in processors:
processed = processor(data)
result.extend(processed)
return result
return pipeline
def double_values(data):
return [x * 2 for x in data]
def filter_even(data):
return [x for x in data if x % 2 == 0]
pipeline = create_pipeline(double_values, filter_even)
result = pipeline([1, 2, 3, 4])
🔍 よくある質問(FAQ)
Q: extendとappendはどう使い分ける? A: 複数要素を個別に追加したい場合はextend、単一要素(リストも含む)をそのまま追加したい場合はappendを使用します。
Q: extendの戻り値は? A: appendと同様、Noneを返します。元のリストが変更されるため、戻り値は使用しません。
Q: extendで文字列を追加すると文字が分解されるのはなぜ? A: 文字列はイテラブルなので、各文字が個別の要素として追加されます。文字列全体を追加したい場合はappendを使用してください。
Q: パフォーマンス的にextendと+演算子のどちらが良い? A: extendの方が効率的です。+演算子は新しいリストを作成するため、メモリ使用量と処理時間が増加します。
💡 ベストプラクティス
- 適切な使い分け: 要素展開が必要な場合のみextendを使用
- 型の確認: 予期しないイテラブルでのエラーを防ぐため型チェックを実装
- 元リストの保護: 元のリストを変更したくない場合はcopy()を使用
- パフォーマンス: 大量データの結合にはextendが最適
- 可読性: 意図が明確になるよう適切なメソッド名を選択
🎯 まとめ
Pythonの**extend()**メソッドは、リストに複数要素を効率的に追加するための強力なツールです。appendとの違いを理解し、適切な場面で使い分けることで、より効率的で読みやすいコードを書けるようになります。
重要なポイント:
- 要素を展開して追加 – ネストではなくフラット化
- イテラブル対応 – リスト、文字列、タプルなど多様な型に対応
- 破壊的操作 – 元のリストが変更される
- 高性能 – 大量データの結合に最適
extendを正しく活用して、Pythonでのリスト操作をマスターしましょう!
この記事は2025年7月時点の情報に基づいています。最新情報はPython公式ドキュメントをご確認ください。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座


