《31》削除:メソッド remove〈Python 3.0 版〉

実録:はじめてのプログラミング記事一覧
《31》削除:メソッド remove

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28 ● 2009年2月25日(水)

削除:メソッド remove

組み込み型 list と同様に、メソッド remove を利用して要素を削除できると便利です。

def ex_remove():
    for e in "ABC@":
        X = 's = myList("ABC"); s'
        print(">>>",X)
        eval(compile(X,"","single"))
        X = 's.remove({0!r}); s'.format(e)
        print(">>>",X)
        eval(compile(X,"(x_x)","single"))

その動作(仕様)を確認すると、

>>>  ex_remove ()
# ---------------------------------------- 11: remove
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> s.remove('A'); s
['B', 'C']
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> s.remove('B'); s
['A', 'C']
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> s.remove('C'); s
['A', 'B']
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> s.remove('@'); s
Traceback (most recent call last):
...
    raise ValueError("{0}.remove(x): x not in {0}".format(s))
ValueError: myList.remove(x): x not in myList

要素を指定すると(その値を含む)ノードを削除します。また、存在しない要素を指定すると、例外 ValueError を生成して、エラーメッセージを出力します。

実現:メソッド remove

メソッド list.remove に準拠したものを実現します〈図解〉。

class myList(object):
    ...
    def remove(self, value):
        prev, node = self.head, self.head.next
        while node:
            if node.item==value:
                prev.next = node.next
                del node
                break
            prev, node = node, node.next
        else:
            s = self.__class__.__name__
            raise ValueError,"%s.remove(x): x not in %s"%(s,s)

ノードの値 node.item が、指定した引数 value と同じ値になるとき、その直前のノードの後続 prev.next は、削除したいノードの後続 node.next と同じ値に再設定します。すると、削除したい直前のノードの後に、削除したい直後のノードが続くようになります。そして、指定した要素を含む、オブジェクト node を削除します。

Tips

break 文を使って while ブロックから抜けたときには、else ブロックを実行しません。すると(フラグ変数など)冗長な表現が不要になるので、簡潔で見通しの良いコードを記述できるようになります。《うさぎ》□

Last updated♪09/03/20