《33》整列:メソッド reverse〈Python 3.0 版〉
実録:はじめてのプログラミング《記事一覧》
《33》整列:メソッド reverse
《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28 ● 2009年2月27日(金)
関連記事
整列:メソッド reverse
組み込み型 list と同様に、メソッド reverse を利用してリスト内の順序を反転できると便利です。
def ex_reverse():
for e in 'myList("")','myList("ABC")':
X = 's = {0}; s'.format(e)
print(">>>",X)
eval(compile(X,"","single"))
X = 's.reverse(); s'.format(e)
print(">>>",X)
eval(compile(X,"","single"))
その動作(仕様)を確認すると、
>>> ex_reverse() >>> s = myList(""); s >>> s.reverse(); s >>> s = myList("ABC"); s ['A', 'B', 'C'] >>> s.reverse(); s ['C', 'B', 'A']
各ノードの順序(オフセット位置)を反転させるとともに、各要素が逆順に得られるのが分かります。また、組み込み関数 id を利用すると(副作用を期待して)メソッド reverse を適用した前後で、同じオブジェクトを参照しているのを確認できます。
実現:メソッド reverse
メソッド list.reverse に準拠したものを実現します。
class myList(object): ... def reverse(self): s = myList() for e in self: s.insert(0,e) self.head = self.tail self.extend(s)
まず、新たな空リスト myList() を用意した後で(メソッド insert を使って)各要素を先頭に挿入することで、順序を反転したリスト s が得られます。次に、先頭のノード self.head は、末尾のノード self.tail と同じ値に再設定します。すると(見せかけだけは)空のリストになります。最後に(メソッド extend を使って)空リストの末尾に、反転したリスト s を連結させます。
受講者への課題
新たなオブジェクト myList() を作成せずに、連結リストの内部構造を変化させるだけで、各要素の順序を反転させるとともに、
def reverse(self):
...
その長所/短所について考察してくたさい。■