リストに要素を追加するにはappendメソッドとextendメソッドが使える。appendメソッドは前回も紹介したが、ここでも簡単にまとめておく。
リスト.append(item)
リストの末尾に要素「item」を追加する。
パラメーター | 説明 |
---|---|
item | 追加する要素の値 |
appendメソッドのパラメーター |
リスト.extend(iterable)
リストの末尾に「iterable」に含まれる全要素を追加する。
パラメーター | 説明 |
---|---|
iterable | リストに追加する要素を含んだ反復可能オブジェクト |
extendメソッドのパラメーター |
これら2つのメソッドは共にリストの末尾に要素を追加するものだが、appendメソッドでは引数が反復可能オブジェクトの場合、それを1つの要素としてリストの末尾に追加する。これに対して、extendメソッドに反復可能オブジェクトを渡すと、その要素が展開(extend)されて、別々の要素としてリストに追加される。
以下に例を示す。
intlist = list(range(5))
intlist.append(5) # リストの末尾に要素「5」を追加
intlist.append([6, 7]) # リストの末尾にリスト「[6, 7]」を追加
intlist.extend([8, 9]) # リストの末尾に要素「8」と要素「9」を追加
print(intlist) # 出力:[0, 1, 2, 3, 4, 5, [6, 7], 8, 9]
実行結果を以下に示す。
リストintlistにappendメソッドでリスト「[6, 7]」を追加したときには、これらが1つの要素として追加されている(リスト「[6, 7]」がintlistの要素となっている)のに対して、appendメソッドでリスト「[8, 9]」を追加したときには、その要素が別々の要素としてintlistに追加されているところに注目しよう*1。
*1 「リスト1.extend(リスト2)」は「リスト1 = リスト1 + リスト2」または「リスト1 += リスト2」に相当する操作と考えられる。ただし、「+」演算子によるリストの結合は新しいリストを作成するので、厳密には少し異なる操作となる。前回のコラム「リストの結合における「+」演算子と「+=」演算子の違い」も参照のこと。
append/extendメソッドはリストの末尾に要素を追加するものだったが、リストの任意の位置に要素を「挿入」することも可能だ。これにはinsertメソッドを使用する。
リスト.insert(index, item)
リスト中の「index」で指定したインデックス位置に、要素「item」を挿入する。
パラメーター | 説明 |
---|---|
index | itemを挿入するインデックス位置 |
item | 挿入する要素の値 |
insertメソッドのパラメーター |
例を以下に示す(実行結果は省略)。
intlist = list(range(5))
intlist.insert(2, 100)
print(intlist) # 出力:[0, 1, 100, 2, 3, 4]
この例では、insertメソッドを使って、リスト「[0, 1, 2, 3, 4]」のインデックス2に要素「100」を追加している。これによりリストは「[0, 1, 100, 2, 3, 4]」のようになる。
リストから要素を削除するには、幾つかの方法がある。
del文による要素の削除では、「del リスト[インデックス]」とすることで、そのリストから指定したインデックス位置にある要素がされる。以下に例を示す。
foo = 'foo'
bar = 'bar'
baz = 'baz'
strlist = [foo, bar, baz]
print(strlist) # ['foo', 'bar', 'baz']
del strlist[1] # strlistのインデックス1の要素を削除
print(strlist) # 出力結果:['foo', 'baz'](リストから要素'bar'が削除された)
print(bar) # 出力結果:bar(変数barが参照している文字列'bar'は削除されていない)
以下に実行結果を示す。
この例では、最初に3つの文字列'foo'、'bar'、'baz'を要素とするリストを作っているが、それらの文字列は全て変数foo、bar、bazに一度代入されたものだ。その上で、リストにそれらを格納して、インデックス1にある要素を削除している。これにより、文字列'bar'を値とする要素がリストから削除されるが、変数barが参照している文字列が削除されるわけではないことに注意しよう。これまでにも何度か述べてきたが、「変数やリストの要素は、オブジェクトに付けられる名札」のようなものだ。つまり、「del strlist[1]」という操作は、「strlist[1]という名札を削除」しているものだと考えられる。
変数barと(削除する前の)strlist[1]は同じ文字列'bar'を参照するが、「del strlist[1]」は「strlist[1]という名札を削除して、文字列'bar'との関連付けを解除する」だけのものであり、変数barは依然として同じ文字列を指し続ける。このことは、以下のメソッドで要素を削除する場合も同様であるし、「変数や要素が名札」というのはリストの要素を変更するときにも注意しておきたいことである。
removeメソッドは、「引数に指定した値と等しい値を持つ要素」をリストから削除する。
リスト.remove(value)
「value」に等しい最初の要素をリストから削除する。
パラメーター | 説明 |
---|---|
value | リストから削除したい値 |
removeメソッドのパラメーター |
removeメソッドで要素を削除する際に、引数の値と等しい値がリストに複数含まれているときには、インデックスが最小のものが削除される。指定した値がリストに含まれていなければ、エラー(ValueError例外)が発生する。なお、removeメソッドには戻り値はないことに注意しよう。
以下に例を示す。
intlist = [-6, 4, 1, 0, -2, 4, 3, 6]
intlist.remove(4) # 値が「4」に等しい最初の要素を削除
print(intlist) # 出力結果:[-6, 1, 0, -2, 4, 3, 6]
intlist.remove(False) # 値が「False」に等しい最初の要素を削除
print(intlist) # 出力結果:[-6, 1, -2, 4, 3, 6]
intlist.remove(100) # エラー
実行結果を以下に示す。
最初のremoveメソッド呼び出しでは、整数値「4」を引数に指定しているが、リストintlistには「4」は2つ含まれている。このときには、インデックスが小さい方が削除される。次の呼び出しでは、引数に「False」を指定している。ところが、リストintlistは整数値だけを含むリストだ。そのため、要素は何も削除されないように思える。しかし、整数値「0」は「False」と等しいと解釈されるので、実際にはリストから要素「0」が削除されている。最後の呼び出しでは、リストに含まれていない要素「100」を指定しているので、エラーが発生している。
popメソッドは、引数にリスト内のインデックスを指定すると、その位置の要素を削除すると共に、その値を戻り値として返す。引数を指定しなかった場合には、末尾の要素が削除されて、その値が戻り値となる。
リスト.pop(index)
リストから「index」に指定した位置にある要素を削除して、その値を戻り値とする。
パラメーター | 説明 |
---|---|
index | 削除したい要素のインデックス(省略可能)。省略した場合は「-1」が指定されたものとして、末尾の要素が削除される |
popメソッドのパラメーター |
使用例を以下に示す。
intlist = list(range(5))
while intlist:
print(intlist.pop())
このコードはリストintlistが空になるまでループを続け、その内部では末尾の要素を削除して、その値を画面に出力するものだ。以下に実行結果を示す。
引数を指定しないpopメソッドは、リストの末尾に要素を追加するappendメソッドと「リスト末尾に対する要素の追加と削除」という意味で対になるものだ(これに対して、appendメソッドとremoveメソッドは「リストに対して指定した値を追加/削除」という意味で対になっている)。
「リストの末尾にappendメソッドで要素を追加」→「popメソッドで末尾の要素を削除して、その値を取得」という処理は「リストに最後に追加された要素が、最初に取り出される」(last-in, first-out:LIFO)処理でもあり、このようなデータ構造のことを「スタック」と呼び、プログラミングの世界ではしばしば目にすることがある。スタックは「その先頭に要素をプッシュして、ポップすることでそれを取り出す」ものだが、リストの末尾をスタックの先頭と見なすことで、同等な操作が行えるということだ。
これと反対に「最初に追加された要素が、最初に取り出される」(first-in, first-out:FIFO)ようなデータ構造のことを「キュー」と呼ぶ。リストでもpopメソッドの引数に「0」を渡せば、この動作を実現できる(ただし、実行速度の面でメリットがないので、Pythonのドキュメント「リストをキューとして使う」では、キューを使用する場合には別のデータ型を使用することが推奨されている)。
スタックについては「スタック とは?」を、キューについては「キュー とは?」を参照されたい。Pythonのクラスを説明する際には、これらのデータ構造を自分で作りながら、理解を深めていく予定だ。
リストの全要素を削除するには、clearメソッドを使用する。パラメーターはなく、戻り値も返さない。以下に使用例を示す。
intlist = list(range(10)) # 0〜9の整数値を要素とするリストを作成
print(intlist) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(id(intlist)) # intlistのアイデンティテイーを表示
intlist.clear() # リストの全要素を削除
print(intlist) # []
print(id(intlist)) # intlistのアイデンティテイーは変わらない
intlist.append(5)
intlist = [] # intlistに空のリストを代入(リストを削除)
print(id(intlist)) # intlistのアイデンティテイーが変化する
clearメソッドはリストのスライスとして「[:]」(全要素を含むスライスを意味する)を指定して、del文を実行するのと同様の処理を行う。リストを空にするだけなら、上のコードの最後で行っているように空のリスト「[]」を代入してもよいが、この場合はリストのアイデンティテイーが変化する。実行結果を以下に示す。
最初にlist関数を使って作成したリストと、clearメソッドを使ってその全要素を削除した時点でのアイデンティティーは共に「58182792」になっているが、空のリスト「[]」を代入すると「58160896」に変化している点に注意しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.