各種の演算子/メソッドを使って、リストの末尾に要素を追加したり、リスト内の指定した位置に要素を挿入したりする方法を紹介する。
* 本稿は2020年12月11日に公開された記事をPython 3.12.2で動作確認したものです(確認日:2024年3月1日)。
mylist = list(range(5))
print(mylist) # [0, 1, 2, 3, 4]
# +演算子によるリストの結合(リストの末尾へのリストの追加)
tmp = mylist + [5, 6] # +演算子では新しいリストが作成される
print(tmp) # [0, 1, 2, 3, 4, 5, 6]
print(mylist) # [0, 1, 2, 3, 4]
mylist = mylist + 5 # TypeError:リストはリスト以外と結合できない
mylist = mylist + (5, 6) # TypeError:リストはリスト以外と結合できない
# +=演算子によるリスト末尾への要素の追加
mylist += [5] # +=演算(累算代入)では元のリストが変更される
print(mylist) # [0, 1, 2, 3, 4, 5]
mylist += 6 # TypeError:リストへ累算代入できるのは反復可能オブジェクトのみ
mylist += (6, 7) # リスト末尾にタプルの個々の要素を追加
print(mylist) # [0, 1, 2, 3, 4, 5, 6, 7]
Pythonでリスト(配列)に要素を追加するには幾つかの方法がある。+演算子を使って、「リスト1 + リスト2」とすると、リスト1の末尾にリスト2の内容が追加されたリストが新たに作成される。+=演算子を使って、「リスト1 += リスト2」とすると、リスト1の末尾にリスト2の内容が追加される。詳しくは、「+演算子または+=演算子を使う方法」を参照。
mylist = list(range(5))
mylist.append(5) # リストの末尾に要素を追加
print(mylist) # [0, 1, 2, 3, 4, 5]
mylist.append(6, 7) # TypeError:appendメソッドの引数は1つだけ
mylist.append([6, 7]) # リストの末尾に単一の要素として「リスト」を追加
print(mylist) # [0, 1, 2, 3, 4, 5, [6, 7]]
mylist.extend([8, 9]) # リストの末尾に反復可能オブジェクトの個々の要素を追加
print(mylist) # [0, 1, 2, 3, 4, 5, [6, 7], 8, 9]
mylist.extend(10) # TypeError:extendメソッドには反復可能オブジェクトのみ渡せる
mylist.extend({10: 'foo', 11: 'bar'}) # 反復可能オブジェクトなのでOK
print(mylist) # [0, 1, 2, 3, 4, 5, [6, 7], 8, 9, 10, 11]
mylist.insert(1, 0.5) # 指定したインデックスに要素を挿入
print(mylist) # [0, 0.5, 1, 2, 3, 4, 5, [6, 7], 8, 9, 10, 11]
リストの末尾に要素を追加するメソッドとしては、appendメソッドとextendメソッドが使える。appendメソッドは引数を1つ受け取り、それをリストの末尾に単一の要素として追加する。extendメソッドは引数に反復可能オブジェクトを1つ受け取り、その個々の要素をリストの末尾に順次追加する(リストの拡張)。任意の位置に要素を挿入するには、insertメソッドが使える。詳しくは「append/extend/insertメソッドを使う方法」を参照。
Pythonでリスト(配列)の末尾に要素を追加したり、リスト同士を結合したりするには以下のような方法がある(この他にもスライスを使う方法もあるが、本稿では割愛する。スライスを用いたリストの要素へのアクセスについては「リスト(配列)の要素にインデックスやスライスを使ってアクセスするには」を参照されたい)。
以下ではまず、+演算子と+=演算子を使う方法から見ていこう。
+演算子を使って「リスト1 + リスト2」とすると、2つのリストの内容を結合した新しいリストが作成される。
mylist = [0, 1] + [2, 3] # 1つ目のリストの末尾に2つ目のリストの内容が追加される
print(mylist) # [0, 1, 2, 3]
tmp = mylist + [4, 5] # mylistと[4, 5]の要素から成る新しいリストがtmpに代入される
print(tmp) # [0, 1, 2, 3, 4, 5]
print(mylist) # mylistは以前のまま
注意点としては、リストに結合できるのはリストだけである点だ。例えば、「リスト +整数値」のようにすると、リストに整数値が要素として追加されるのではなく、TypeError例外が発生する。
mylist + 6 # TypeError
+=演算子を使って「リスト1 += リスト2」とすると、リスト1の末尾にリスト2の内容が追加される(これを「リストの拡張」などと呼ぶこともある)。+演算子とは異なり、新しいリストが作成されることはない。
mylist = [0, 1]
mylist += [2, 3] # mylistが拡張されて[0, 1, 2, 3]というリストになる
print(mylist) # [0, 1, 2, 3]
+=演算子を使って、末尾に整数値などを追加できないのは、+演算子と同様だ。その一方で、+演算子とは異なり、+=演算子を使うと、リスト以外の反復可能オブジェクトをリストの末尾に追加できる。
# 反復可能オブジェクト以外は+=演算子の右側には置けない
mylist += 4 # TypeError
# タプルの要素をリスト末尾に追加
mylist += (4, 5)
print(mylist) # [0, 1, 2, 3, 4, 5]
# 辞書のキーをリスト末尾に追加
mylist += {6: 'foo', 7: 'bar'} # この場合はキーの値がmylistの末尾に追加される
print(mylist) # [0, 1, 2, 3, 4, 5, 6, 7]
# 文字列の要素をリスト末尾に追加
mylist += '89' # 文字列も反復可能オブジェクト
print(mylist) # [0, 1, 2, 3, 4, 5, 6, 7, '8', '9']
辞書も反復可能オブジェクトなので、上記のコードはエラーとはならない。上のコードでは、辞書のキーがリスト末尾に追加される。注意したいのは、文字列は反復可能オブジェクトなので、1つの文字列を単一の要素としてリストに追加しようとしても、+=演算子では文字列を構成する個々の文字が1つ1つの要素としてリストに追加されてしまうところだ。文字列を単一の要素としてリストに追加するのであれば、後述のappendメソッドを使用する。
Pythonではリストが持つ以下の3つのメソッドを使っても、リスト(配列)に要素を追加できる。
appendメソッドとextendメソッドはどちらも、受け取った値をリスト末尾に追加するがその方法が異なる。まずappendメソッドから見てみよう。
mylist = [0, 1, 2]
mylist.append(3) # 要素3を末尾に追加
print(mylist) # [0, 1, 2, 3]
mylist.append('45') # 文字列'45'を末尾に追加
print(mylist) # [0, 1, 2, 3, '45']
mylist.append([6, 7]) # 要素[6, 7]を末尾に追加
print(mylist) # [0, 1, 2, 3, '45', [6, 7]]
1つ目の例では、appendメソッドに整数3を指定している。このときには、これが単一の要素としてリスト(mylist)に追加されているのが分かる。次の例では、文字列をリスト末尾に追加している。+=演算子の例とは異なり、文字列全体が単一の要素としてリスト末尾に追加されているのが分かるはずだ。最後の例では、引数にリスト[4, 5]を指定している。このときには、引数に与えたリストがそのまま単一の要素として追加されている。
そうではなく、[0, 1, 2, 3]というリストに[4, 5]というリストを与えて、[0, 1, 2, 3, 4, 5]というリストにしたいのであれば、extendメソッドを使用する。以下に例を示す。
mylist = [0, 1, 2, 3]
mylist.extend([4, 5]) # リストの要素を末尾に追加
print(mylist) # [0, 1, 2, 3, 4, 5]
こちらでは、引数に指定したリストに含まれる1つ1つの要素が、mylistの末尾に順番に追加されている。このように、appendとextendの使い分けの大まかな方針はどのような形でリスト末尾に要素を追加したいかによる。
なお、extendメソッドに渡せるのは反復可能オブジェクトだけである(+=演算子と同様)。1個の整数をextendメソッドでリスト末尾に追加するのであれば、次のようにリスト(あるいは他の反復可能オブジェクト)の要素にして渡す必要がある。
mylist.extend(6) # TypeError
mylist.extend([6])
print(mylist) # [0, 1, 2, 3, 4, 5, 6]
その一方で、extendメソッドではリスト以外の反復可能オブジェクトもリスト末尾に追加できる。
mylist = [0, 1, 2]
mylist.extend((3, 4)) # タプルの要素がリスト末尾に追加される
print(mylist) # [0, 1, 2, 3, 4]
mylist.extend({5: 'foo', 6: 'bar'}) # 辞書のキーがリスト末尾に追加される
print(mylist) # [0, 1, 2, 3, 4, 5, 6]
mylist.extend('78') # 文字列も反復可能オブジェクト
print(mylist) # [0, 1, 2, 3, 4, 5, 6, '7', '8']
3つ目の例に示したように、文字列は反復可能オブジェクトなので、その文字列を構成する各文字がリストに1文字ごとに追加される点には注意しよう(これも+=演算子と同様)。文字列全体を単一要素としてリスト末尾に追加したいのであれば、既に見たように、appendメソッドを使用する(か、文字列全体をリストの要素として、appendメソッドに与える)。
appendメソッドとextendメソッドはどちらもリストの末尾に要素を追加するものだが、insertメソッドはその名の通り、リスト中の任意の位置に要素を追加するものだ。insertメソッドは第1引数に挿入したい位置(インデックス)を、第2引数に挿入したい値を指定して呼び出す。
mylist = list(range(5))
mylist.insert(3, 2.5) # インデックス3に要素2.5を追加
print(mylist) # [0, 1, 2, 2.5, 3, 4]
mylist.insert(5, [3.25, 3.5]) # 第2引数に指定した値は単一の要素として挿入される
print(mylist) # [0, 1, 2, 2.5, 3, [3.25, 3.5], 4]
mylist.insert(-1, 3.75) # 負数のインデックスも指定可能
print(mylist) # [0, 1, 2, 2.5, 3, [3.25, 3.5], 3.75, 4]
2つ目の例に示したように、第2引数に指定した値は単一の要素として挿入されることは覚えておこう(appendメソッドと同様)。なお、要素が存在しない範囲をインデックスに指定した場合、リストの先頭または末尾に要素が挿入される。
mylist = [0, 1, 2]
mylist.insert(10, 10)
print(mylist) # [0, 1, 2, 10]
mylist.insert(-5, -5)
print(mylist) # [-5, 0, 1, 2, 10]
Copyright© Digital Advantage Corp. All Rights Reserved.