検索
ハッシュ表に限らず、任意の要素を検索する操作は必須です。補助関数 _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》