《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