我已经由一位导师设置了一项家庭作业,以创建一个对字符串进行哈希处理的过程,或者在某种意义上给出了哈希表中字符串的索引(如果已对其进行哈希处理)。
应该返回11,但是返回0,有人可以帮我找出原因吗?
def hash_string(keyword, buckets):
ords = []
for e in string_to_list(keyword):
ords.append(ord(e))
sum_of_ords = ords.pop()
for e in ords:
sum_of_ords = sum_of_ords * e
return sum_of_ords % buckets
print(hash_string('udacity', 12)) # should return 11 but returns 0?
这里是string_to_list
,我知道可能有更好的方法,但这是我唯一知道的方法,无需使用Google来搜索此类事物的内置方法
def string_to_list(str):
result_list = []
i = 0
while i < len(str):
result_list.append(str[i:i + 1])
i += 1
return result_list
这是我的导师描述答案的方式,但是我不理解他对h所做的事情吗?这只是我要做的事情的简化版本吗?
def hash_string(keyword, buckets):
h = 0
for c in keyword:
h = (h + ord(c)) % buckets
return h
答案 0 :(得分:3)
您似乎想在这里添加但无意间相乘:
sum_of_ords = sum_of_ords * e
将此更改为:
sum_of_ords = sum_of_ords + e
或者,通过复合分配:
sum_of_ords += e
顺便提一句,您可以将功能简化为以下简单操作:
def hash_string(keyword, buckets):
return sum(ord(c) for c in keyword) % buckets
答案 1 :(得分:1)
问题是您使用了一些不必要的功能,例如使用.pop()
,for
循环,并且可以使用hash_string
来替换list(<string>)
函数。 / p>
示例:
def hash_string(keyword, buckets):
ords = []
for e in list(keyword):
ords.append(ord(e))
return sum(ords) % buckets
这甚至可以进一步简化为:
def hash_string(keyword, buckets):
return sum([ord(char) for char in list(keyword)]) % buckets