用字符串进行Python散列

时间:2014-10-10 05:25:39

标签: python string

我正在尝试创建一个带字符串(键)的函数,并返回哈希表的插槽号。 这样:

for key_word in ["John","Jane"]:
    print(key_word, special_hash(key_word, 13)) 
>>> John 8 
    Jane 4

该函数需要使用字母位置将字符串的每个字母转换为数字形式(例如,a = 1,b = 2,c = 3等)。所以散列将是:John = 10 + 15 + 8 + 14 = 47 -----> = 47%tableize(13)

2 个答案:

答案 0 :(得分:2)

您可以使用lower函数将字符串转换为小写,并使用for循环遍历单词中的字符,如下所示

def special_hash(word, tablesize):
    for char in word.lower():
        ...

然后,您可以使用ord函数获取与该字符对应的字符代码。

def special_hash(word, tablesize):
    total_value = 0
    for char in word.lower():
        total_value += ord(char) - ord('a') + 1

由于我们需要在字母表中获取字符的偏移量,因此可以从当前值中减去第一个值。最后,您可以使用模运算符%来获得除tablesize

之后的除法余数
def special_hash(word, tablesize):
    total_value = 0
    for char in word.lower():
        total_value += ord(char) - ord('a') + 1
    return total_value % tablesize

使用generator expression和内置sum函数可以写出相同的内容,就像这样

def special_hash(word, tablesize):
    return sum(ord(char) - ord('a') + 1 for char in word.lower()) % tablesize

答案 1 :(得分:0)

使用ord函数并减去ascii偏移量(字母为97代码,b为98,依此类推)

>>> ascii_offset = ord('a')-1 #http://www.asciitable.com/
>>> def special_hash(word, tablesize):
...     return sum([ord(c) - ascii_offset for c in word.lower() ]) % tablesize
... 
>>> special_hash('John',13)
8
>>> ##47%13 -> 8