2015-10-05 4 views
1
class MyHashTable: 

    def __init__(self, capacity): 
     self.capacity = capacity 
     self.slots = [None] * self.capacity 

    def __str__(self): 
     return str(self.slots) 

    def __len__(self): 
     count = 0 
     for i in self.slots: 
      if i != None: 
       count += 1 
     return count 

    def hash_function(self, key): 
     slot = key % len(self.slots) 

     if key in self.slots: 
      return slot 

     elif (not key in self.slots) and len(self.slots) == self.capacity: 
      return slot 

     else: 
      for i in self.slots: 
       count = 0 
       if i == None: 
        return count 
       count += 1 

    def insert(self, key): 
     print(len(self.slots)) #Why does this show an output of 2? 
     if key in self.slots: 
      return -2 

     elif (not key in self.slots) and (len(self.slots) != self.capacity): #Now this cant execute 
      num = hash_function(key) 
      self.slots[num] = key 
      return num 

     elif (not key in self.slots) and len(self.slots) == self.capacity: 
      return -1 

Im интересно, почему комментируемая часть выше в insert(self, key) операторах печати дает (2) вместо (0). Заявление Элиф под обыкновение выполнять, так как его дает результат (2) вместо (0)код отслеживания и логические ошибки

Функция вызов

x = MyHashTable(2) 
print(len(x)) 

Если дать: 0

+0

Вы не должны сравнивать с 'None' с' == '. Вместо этого вы должны проверить, например, 'if i is None 'или' if i is not None' – donkopotamus

ответ

1

Вы инициализирующий self.slots = [None] * self.capacity, так с capacity = 2, self.slots является [None, None], который имеет длину 2.

Ваш метод __len__ не работает, потому что len(self.slot) звонки self.slot.__len__, а не self.__len__. Если вы хотите использовать свой метод переопределения, вместо этого вы должны называть len(self).

+0

Но как насчет def __len __ (self): Не должно ли это переопределить функцию len() и, таким образом, дать 2? –

+0

, что переопределение для самого класса/объекта, а не 'self.slot'. выполнение 'len (self.slot)', вызовет этот список '__len __()'. Я предполагаю, что вы хотели сделать len (self) '. –

+0

@ WojackO'feel Как заметил Ананд, переопределение '__len__' относится к классу' MyHashTable', а не к 'self.slot' (который является экземпляром' list'). –

1

Вы должны называть свою функцию __len__ (вызывая self.__len__()), если вы хотите, чтобы длина элементов не была ничем. Для списков Нет действительных записей.

Кстати. Всегда лучше сравнивать с None на a is None или a is not None вместо == или !=.

+0

Как я могу назвать функцию __len__? Я думал, что len() будет переопределено, кстати, почему «a is None» лучше, чем оператор ==? –

+0

просто используйте 'self .__ len __()' или 'len (self)' вместо 'len (self.slots)' – MSeifert

+0

А, вы перезаписали len-функцию, но только для своего класса, а не для массива, который вы используете для 'self.slots'. Это всегда относится к 'self.slots .__ len__', а не к' self .__ len__'. О разнице между '==' и 'is': https://www.python.org/dev/peps/pep-0008/ (см. Второй пункт в разделе« Рекомендации по программированию ») – MSeifert

Смежные вопросы