【Python入門】listのextendとは?appendとの違い・使い方・注意点を初心者向けに徹底解説!

python

「リストに複数の要素を一度に追加したい」
「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()位置を指定できる
新しいリストを作成+演算子元のリストを保持

コメント

タイトルとURLをコピーしました