「リストに複数の要素を一度に追加したい」
「appendとextendの違いがよくわからない」
このような疑問を持ったことはありませんか?Pythonでリストを操作するとき、extend()
メソッドを使うと、複数の要素を効率的に追加できます。
この記事では、extend()
の基本的な使い方から、append()
との違い、実用的な活用例まで、初心者の方にもわかりやすく解説します。
extendメソッドの基本的な使い方
複数要素を一度に追加する
extend()
メソッドは、リストに複数の要素をまとめて追加するときに使います。
fruits = ["りんご", "バナナ"]
fruits.extend(["オレンジ", "ぶどう"])
print(fruits)
実行結果:
['りんご', 'バナナ', 'オレンジ', 'ぶどう']
このように、リストの中身がひとつずつ展開されて、元のリストの最後に追加されます。
extendの動作をくわしく見る
extend()
がどのように動作するかを段階的に見てみましょう。
numbers = [1, 2, 3]
print(f"追加前: {numbers}")
numbers.extend([4, 5, 6])
print(f"追加後: {numbers}")
実行結果:
追加前: [1, 2, 3]
追加後: [1, 2, 3, 4, 5, 6]
[4, 5, 6]
の中身が一つずつ取り出されて、元のリストに追加されているのがわかります。
appendとextendの重要な違い
この2つのメソッドは、似ているようで全く違う動作をします。
appendを使った場合
colors = ["赤", "青"]
colors.append(["緑", "黄色"])
print(colors)
実行結果:
['赤', '青', ['緑', '黄色']]
append()
では、リスト全体が1つの要素として追加されます。結果として、リストの中にリストが入った「入れ子」の状態になります。
extendを使った場合
colors = ["赤", "青"]
colors.extend(["緑", "黄色"])
print(colors)
実行結果:
['赤', '青', '緑', '黄色']
extend()
では、リストの中身が展開されて、一つずつ追加されます。
両者の違いをまとめると
メソッド | 動作 | 結果 | 使う場面 |
---|---|---|---|
append() | 引数全体を1つの要素として追加 | 入れ子のリスト | 1つの要素を追加したいとき |
extend() | 引数の中身を展開して追加 | フラットなリスト | 複数の要素を一度に追加したいとき |
extendで使えるデータ型
extend()
には、「イテラブル」と呼ばれる、繰り返し処理ができるデータを渡すことができます。
リストを渡す場合
my_list = [1, 2]
my_list.extend([3, 4, 5])
print(my_list)
実行結果:
[1, 2, 3, 4, 5]
タプルを渡す場合
my_list = [1, 2]
my_list.extend((3, 4, 5)) # タプルを渡す
print(my_list)
実行結果:
[1, 2, 3, 4, 5]
文字列を渡す場合(注意が必要)
letters = ["a", "b"]
letters.extend("cd")
print(letters)
実行結果:
['a', 'b', 'c', 'd']
文字列を渡すと、1文字ずつ分解されて追加されます。これは意図しない結果になることがあるので注意が必要です。
セットを渡す場合
numbers = [1, 2]
numbers.extend({3, 4, 5})
print(numbers)
実行結果:
[1, 2, 3, 4, 5] # 順序は保証されない
セットは順序が決まっていないため、追加される順序は実行するたびに変わる可能性があります。
使えないデータ型
数値や単一の文字など、繰り返しできないデータは使えません。
my_list = [1, 2]
my_list.extend(3) # エラーになる
エラーメッセージ:
TypeError: 'int' object is not iterable
実用的な使用例
複数のリストを結合する
list1 = ["りんご", "バナナ"]
list2 = ["オレンジ", "ぶどう"]
list3 = ["メロン", "いちご"]
# すべてのリストを結合
all_fruits = []
all_fruits.extend(list1)
all_fruits.extend(list2)
all_fruits.extend(list3)
print(all_fruits)
実行結果:
['りんご', 'バナナ', 'オレンジ', 'ぶどう', 'メロン', 'いちご']
条件に合う要素だけを追加
even_numbers = []
odd_numbers = []
for i in range(10):
if i % 2 == 0:
even_numbers.extend([i]) # 偶数を追加
else:
odd_numbers.extend([i]) # 奇数を追加
print(f"偶数: {even_numbers}")
print(f"奇数: {odd_numbers}")
実行結果:
偶数: [0, 2, 4, 6, 8]
奇数: [1, 3, 5, 7, 9]
入れ子のリストを平たくする
二次元のリストを一次元のリストに変換する例です。
nested_list = [[1, 2], [3, 4], [5, 6]]
flat_list = []
for sublist in nested_list:
flat_list.extend(sublist)
print(flat_list)
実行結果:
[1, 2, 3, 4, 5, 6]
ファイルから読み込んだデータを追加
# CSVファイルのような形式のデータを処理する例
csv_rows = [
["田中", "25", "東京"],
["佐藤", "30", "大阪"],
["鈴木", "22", "福岡"]
]
all_data = []
for row in csv_rows:
all_data.extend(row)
print(all_data)
実行結果:
['田中', '25', '東京', '佐藤', '30', '大阪', '鈴木', '22', '福岡']
extendを使うときの注意点
元のリストが変更される
extend()
は、元のリストを直接変更します(破壊的変更)。
original = [1, 2, 3]
backup = original # 同じリストを参照
original.extend([4, 5])
print(f"original: {original}")
print(f"backup: {backup}")
実行結果:
original: [1, 2, 3, 4, 5]
backup: [1, 2, 3, 4, 5]
backup
も変更されてしまいます。元のリストを保持したい場合は、コピーを作成しましょう。
original = [1, 2, 3]
backup = original.copy() # コピーを作成
original.extend([4, 5])
print(f"original: {original}")
print(f"backup: {backup}")
実行結果:
original: [1, 2, 3, 4, 5]
backup: [1, 2, 3]
戻り値はNone
extend()
は何も値を返しません(戻り値はNone
)。
numbers = [1, 2, 3]
result = numbers.extend([4, 5])
print(f"numbers: {numbers}")
print(f"result: {result}")
実行結果:
numbers: [1, 2, 3, 4, 5]
result: None
非イテラブルなデータの対処法
数値などの非イテラブルなデータを追加したい場合は、リストに包んでから渡します。
# 間違った方法
numbers = [1, 2]
# numbers.extend(3) # エラー
# 正しい方法
numbers.extend([3]) # リストに包む
print(numbers)
実行結果:
[1, 2, 3]
他のリスト操作メソッドとの比較
append、extend、insertの使い分け
メソッド | 用途 | 例 | 結果 |
---|---|---|---|
append(x) | 1つの要素を最後に追加 | [1,2].append(3) | [1, 2, 3] |
extend(iterable) | 複数要素を展開して最後に追加 | [1,2].extend([3,4]) | [1, 2, 3, 4] |
insert(i, x) | 指定位置に1つの要素を挿入 | [1,3].insert(1, 2) | [1, 2, 3] |
+演算子との違い
リストの結合には+
演算子も使えますが、動作が異なります。
# extend を使う場合(元のリストを変更)
list1 = [1, 2]
list1.extend([3, 4])
print(f"extend: {list1}")
# + 演算子を使う場合(新しいリストを作成)
list2 = [1, 2]
list3 = list2 + [3, 4]
print(f"元のリスト: {list2}")
print(f"新しいリスト: {list3}")
実行結果:
extend: [1, 2, 3, 4]
元のリスト: [1, 2]
新しいリスト: [1, 2, 3, 4]
よくある質問と回答
Q: 空のリストをextendするとどうなる?
numbers = [1, 2, 3]
numbers.extend([])
print(numbers)
実行結果:
[1, 2, 3]
何も追加されず、元のリストのままです。
Q: extendの引数に辞書を渡すとどうなる?
my_list = [1, 2]
my_dict = {"a": 1, "b": 2}
my_list.extend(my_dict)
print(my_list)
実行結果:
[1, 2, 'a', 'b']
辞書のキーだけが追加されます。値を追加したい場合はmy_dict.values()
を使います。
Q: 文字列を1つの要素として追加するには?
文字列を文字単位ではなく、1つの要素として追加したい場合はappend()
を使うか、リストに包んでからextend()
を使います。
words = ["hello"]
# append を使う場合
words.append("world")
print(f"append: {words}")
# extend を使う場合(リストに包む)
words2 = ["hello"]
words2.extend(["world"])
print(f"extend: {words2}")
実行結果:
append: ['hello', 'world']
extend: ['hello', 'world']
まとめ
extend()
メソッドは、Pythonでリストに複数の要素を効率的に追加するための重要な機能です。
重要なポイント
extend()
は複数要素を展開して追加するappend()
は要素全体を1つとして追加する- イテラブルなデータ(リスト、タプル、文字列など)を引数に取る
- 元のリストを直接変更する(破壊的変更)
- 戻り値は
None
使い分けの目安
状況 | 使うメソッド | 理由 |
---|---|---|
1つの要素を追加 | append() | シンプルで直感的 |
複数要素を一度に追加 | extend() | 効率的で読みやすい |
特定位置に挿入 | insert() | 位置を指定できる |
新しいリストを作成 | + 演算子 | 元のリストを保持 |
コメント