検索
連載

[Python入門]リストの基本Python入門(3/4 ページ)

数値や文字列などの基本データ型と並んで、Pythonでとてもよく使われるデータ型である「リスト」の基礎知識を説明する。

Share
Tweet
LINE
Hatena

リストの結合

 今見たappendメソッドの引数は1つだけで、渡されたものをリストの末尾に追加する(上では文字列を追加しているが、もちろん、それ以外の値を追加することも可能だ)。複数の要素を一度に追加したいときには、「+」演算子を使ってリストを「結合」できる。例えば、以下は先ほど作成したリストに文字列「'C#'」と整数値「99」を追加するものだ。

cs = 'C#'
number = 99

languages = languages + [cs, number]
print(languages)

複数の要素を追加するには、リストを「結合」する

 このコードを実行した結果を以下に示す。

リストを結合した結果
リストを結合した結果

 「+」演算子によるリスト結合は、「リスト+リスト」の形式でなければならない。そのため、上のコードでは追加する2つの値(文字列「'C#'」と整数値「99」)を含んだリスト([cs, number])を作成して、結合していることに注意しよう。これは「+」演算子を使ってリストに要素を1つ追加する場合でも同様だ(例:languages + ['C++'])。「+」演算子でリストに単一要素を追加しようとして、次のようなコードを書くとどうなるかを試してみよう。

languages + 'C++'

リストと文字列を結合しようとしたコード

 上のコードをセルに入力して、実行した結果を以下に示す。

リストと文字列は結合できない
リストと文字列は結合できない

 ご覧のように、「TypeError」が発生している。その説明を日本語に直すと、「できるのは、リストへのリストの結合だけです(文字列はダメ)」となる。

リストの結合における「+」演算子と「+=」演算子の違い

 ところで、「+」演算子によるリストの結合では、その結果を元のリストに代入していることに気が付いただろうか。

languages = languages + [cs, number]

リストを結合して、その結果を元のリストに代入している

 「リスト1 + リスト2」としてリストを結合すると、2つのリストの要素を含んだ新しいリストが作られる。このコードでは、その結合結果を元の変数に代入しているわけだ。これを実際に調べてみるには、Pythonに組み込みのid関数が使える。

 id関数は引数に指定したオブジェクトの「アイデンティティー」(識別値)を戻り値とする。Pythonではオブジェクト(整数値や文字列、リストなど)を定義すると、「それを識別する値」が割り当てられる。これがそのオブジェクトの「アイデンティティー」であり、オブジェクトがメモリ上に存在する間はその値が変化することはない。以下にリストを定義、結合するたびにそのアイデンティティーを確認するコードを示す。

somelist = [0, 1, 2]
print(id(somelist))
somelist = somelist + [3, 4]
print(id(somelist))
somelist += [5, 6]
print(id(somelist))

リストを作成、操作するたびにそのアイデンティティーを確認

 最後の例では、「+」演算子ではなく、「+=」演算子を使って同じ操作を行っている。実行結果を以下に示す。

実行結果
実行結果

 まず、定義した直後のアイデンティティーは「140318233038408」となっている。一方、結合した後のアイデンティティーは「140318232637320」だ(読者が上のコードを試すと、アイデンティティーは上の画像とは異なるものになるだろう。ただし、前者と後者が異なるアイデンティティーを持つことは同じはずだ)。これにより、リストの結合により、新しいリスト(オブジェクト)が作成されたことが分かる。

 その一方で、「+=」演算子の場合は、アイデンティティーは「140318232637320」であり、その直前のものと変わっていないことにも注目しよう。「somelist = somelist + anotherlist」と「somelist += anotherlist」は「リストを結合する」という意味では同一の操作だが、実際には最終的なオブジェクトのアイデンティティーが異なるので、完全に同一ではない。とはいえ、難しいことなので、最初はあまり気にする必要はないが、頭のどこかに入れておきたい。


リストからの要素の削除

 リストの要素を削除するには、del文を使用する。これには「del」に続けて(空白文字を置き、そこに続けて)リストの要素を指定する。例えば、先ほどリストlanguagesに追加した「99」という要素をリストから削除するには次のようにする。

del languages[5]
print(languages)

インデックス5にある要素(6番目の要素)の削除

 実行結果を以下に示す。

インデックス5にある要素(6番目の要素)の削除
インデックス5にある要素(6番目の要素)の削除

 あるいは、リストが持つremoveメソッドも使用できる(これは上のappendメソッドと対になるものだ)。引数には削除したい要素の値を指定する。例えば、上のリストから文字列'PHP'をその値とする要素を削除するには次のようにする。

languages.remove('PHP')
print(languages)

リストから文字列'PHP'をその値とする要素を削除

 del文では、インデックスを指定したが、removeメソッドでは削除したい値を指定する点には注意しよう。ちなみに、リストに同じ値が2つあったときには、インデックスの小さい要素が削除される。以下に例を示す。

intlist = [1, 2, 3, 1, 2, 3]
intlist.remove(3)
print(intlist)

removeメソッドは引数に指定した値の中で最もインデックスが小さいものを削除する

 このコードを実行すると、次のようになる。

インデックスが小さい方の「3」が削除されたことが分かる
インデックスが小さい方の「3」が削除されたことが分かる

 このプログラムでは、「1」「2」「3」「1」「2」「3」という要素を格納しているリストに対して、引数を「3」としてremoveメソッドを呼び出している。その結果、値が「3」となる全ての要素が削除されるのではなく、インデックスが小さい方の要素(削除前のintlist[2])が削除されているのが分かる。

 なお、del文はリストの要素を削除するだけではなく、リストそのものを削除するのにも使える。以下に例を示す。

del languages
print(languages)

リストlanguagesを削除

 これを実行すると次のようになる。

「languages」という名前は既に削除されているのでエラーとなる
「languages」という名前は既に削除されているのでエラーとなる

 print関数の実行で「NameError」が発生している。その説明を日本語にすると「'languages'という名前は定義されていませんよ」となる。これは、その前のdel文でリストを代入した変数languagesを削除しているからだ(より正確には、「languages」という「名前」を削除して、リストオブジェクトとの関連付けを解除した)。

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る