検索

ハッシュ表に限らず、任意の要素を検索する操作は必須です。補助関数 _detect は、指定したキー key を含む連結リストをリターン値とします。

class HashTable:
def _detect(self, key):
return self.hashtab[self.hash(key)]._detect(key)

key と同じハッシュ値を持つ連結リストを検索します。

class LinkedList:
def _detect(self, key):
return (None, self)[key in self]

同じキー key を持つ要素が存在するなら、それ自身 self をリターン値とします。存在しないなら、None をリターン値とします。このとき、演算子 in の動作は、後述するメソッド __contains__ によって規定されます。

メソッド __contains__ は何処に

メソッド __contains__ は、演算子 in の動作を規定します。

class HashTable:
def __contains__(self, key):
return bool(self._detect(key)) # CAUTION

前述した補助関数 _detect を利用して、指定したキー key を含む連結リストが存在するなら True を、存在しないなら False を、それぞれリターン値とします。ここで注意して欲しいのは、補助関数 _detect は、None と評価され得ることです。そのため、bool() を利用しています。

class LinkedList:
def __contains__(self, key):
for k in self.keys():
if key == k: return True
else:
return False

同じキー key を持つ要素が「1つでも」存在するなら、True をリターン値とします。存在しないなら、False をリターン値とします。

ためしてガッテン!

>>> p
HashTable([<'good': 1>, <'can': 1, 'happy': 2>, <'as': 2>, <>, <'be': 1>])
>>> "happy" in p
True
>>> "god" in p
False

2項演算子 in の左項に単語を、右項にハッシュ表を指定すると、その単語がハッシュ表に含まれるかどうかを判定した結果 True/False が得られます。単語 "happy" はハッシュ表 p に含まれるので、True が得られます。単語 "god" はハッシュ表 p に含まれないので、False が得られます。



《ひよ子のきもち♪2007/12/11》