Я преобразовал некоторый псевдокод для алгоритма хеширования в python в качестве упражнения, и он отлично работает, за исключением одной проблемы: когда я ищу несуществующую запись, я получаю TypeError: 'NoneType' object is not subscriptable.
Я полностью понимаю, почему я получаю эту ошибку, но я не вижу хорошего способа ее избежать. Может ли кто-нибудь посоветовать мне, как изменить код, чтобы он не выдавал ошибку в этой ситуации?
Я мог бы использовать блок try/except, но это кажется немного запутанным. Я ищу самый простой/самый чистый подход.
Мой код ниже. Строка, выдающая ошибку, — while hash_table[index][0] != search_key and hash_table[index] is not None:.
TABLE_SIZE = 10
customer_records = [
[45876, "Tom's data"],
[32390, "Yolly's data"],
[95312, "George's data"],
[64636, "Bob's data"],
[23467, "Susan's data"]]
def hash(key): # Anti-pattern to overwrite built in function
return key % TABLE_SIZE
def insert(new_record, hash_table):
index = hash(new_record[0])
while hash_table[index] is not None:
index += 1
if index > TABLE_SIZE:
index = 0
hash_table[index] = new_record
def find_record(search_key, hash_table):
index = hash(search_key)
while hash_table[index][0] != search_key and hash_table[index] is not None:
index += 1
if index > TABLE_SIZE:
index = 0
if hash_table[index] is not None:
return hash_table[index]
my_hash_table = [None] * TABLE_SIZE
for record in customer_records:
insert(record, my_hash_table)
print(find_record(45873, my_hash_table))






Просто инвертируйте выражения вокруг оператора and — в Python and замыкается, как только выражение становится False, поэтому всегда следует проверять наличие Noneпервый. Кроме того, проверку None можно немного упростить (None ложный, нет необходимости явно проверять is not None):
while hash_table[index] and hash_table[index][0] != search_key:
Просто переключите строку, чтобы сначала проверить, что это не none, тогда, я думаю, должно работать: