《31》削除:メソッド remove〈Python 2.x 版〉

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

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

今日の進捗

  • Language Reference: Numeric and Mathematical Modules; functools — Higher order functions and operations on callable objects
  • Python.use(better) -- セミナー研修テキスト
  • 連結リスト課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 削除する箇所とタイミングを間違えると大変なことになるのがよく分かりました。
担当:伊藤/本間 。(^^)

削除:メソッド remove

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

def ex():
    for e in "ABC@":
        s = myList("ABC")
        print "-->",s,e,"\t#",s.__class__.__name__
        s.remove(e)
        print "<--",s,e,"\t#",s.__class__.__name__

>>> ex()
    • > ['A', 'B', 'C'] A # myList
<-- ['B', 'C'] A # myList
    • > ['A', 'B', 'C'] B # myList
<-- ['A', 'C'] B # myList
    • > ['A', 'B', 'C'] C # myList
<-- ['A', 'B'] C # myList Traceback (most recent call last): ... raise ValueError,"%s.remove(x): x not in %s"%(s,s) ValueError: myList.remove(x): x not in myList

要素を指定して(その値を含む)ノードを削除するとともに、削除した値が得られるのが分かります。また、存在しない要素を指定すると、例外 ValueError を生成して、エラーメッセージを出力します。そこで、

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