Индекс Python в None для алгоритма хеширования - PullRequest
0 голосов
/ 07 февраля 2019

Я конвертировал некоторый псевдокод для алгоритма хеширования в python в качестве упражнения, и он отлично работает, за исключением одной проблемы: когда я ищу запись, которая не существует, я получаю TypeError: 'NoneType' object is not subscriptable.

Я полностью понимаю, почему я получаю эту ошибку, но я не вижу хорошего способа ее избежать.Может, кто-нибудь посоветует мне, как изменить код, чтобы он не выдавал ошибку в этой ситуации?

Я мог бы использовать блок try / исключением, но это выглядит немного грязно.Я ищу самый простой / чистый подход.

Мой код ниже.Строка, выдающая ошибку: 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)) 

1 Ответ

0 голосов
/ 07 февраля 2019

Просто инвертируйте выражения вокруг оператора and - в Python, and замыкает накоротко, как только выражение становится False, поэтому вы всегда должны проверять None сначала .Кроме того, проверку None можно немного упростить (None неверно, нет необходимости явно проверять is not None):

while hash_table[index] and hash_table[index][0] != search_key:
...