辞書:キーと値

別の記事では、二分木を辞書に「変身」させて、組み込み型 dict と同等の機能を実現しました。今回は、ハッシュ表を辞書に「変身」させる過程を通して、相互の理解を深めます。dict には、次のメソッドを適用できます。
・メソッド keys によって、キーを列挙したリストが得られます。
・メソッド values によって、値を列挙したリストが得られます。
・メソッド items によって、要素対(キー/値)を列挙したリストが得られます。

class HashTable:
def keys (self): return self._do("keys")
def values(self): return self._do("values")
def items (self): return self._do("items")

def _do(self, func):
s = []
for e in self.hashtab:
s += eval("e.%s()"%func)
return s

クラス HashTable では、ハッシュ表の中から、必要な情報だけを抽出します。
メソッド _do は、ハッシュ表を順にたどり、必要な要素だけを含むリスト eval("e.%s()"%func) を生成して、それを順に連結したリスト s をリターン値とします。このとき、引数 func を介して、個別の処理を規定した関数オブジェクトを参照します。

class LinkedList:
def keys (self): return self._do("_keys")
def values(self): return self._do("_values")
def items (self): return self._do("_items")

def _keys (self, e): return e.key
def _values(self, e): return e.value
def _items (self, e): return e.key, e.value

def _do(self, func):
s = []
e = self
while e:
s += [eval("self.%s(e)"%func)]
e = e._next
return s

class NoneList(LinkedList):
def keys (self): return []
def values(self): return []
def items (self): return []

クラス LinkedList では、連結リストの中から、必要な情報だけを抽出します。
メソッド _do は、連結リストを順にたどり、必要な要素だけを含むリスト [eval("self.%s(e)"%func)] を生成して、それを順に連結したリスト s をリターン値とします。このとき、引数 func を介して、個別の処理を規定した関数オブジェクトを参照します。
クラス NoneList では、要素を含まないので、どのメソッドも空リスト [] をリターン値とします。