2015-12-07 73 views
0

我很难理解Learn Python The Hard Way Ex39中的很多代码。学习Python困难的方式Ex39,很难理解它的代码

我的第一个混淆是关于作者为什么在这里使用模块划分hash(key) % len(aMap)。它返回什么价值?为什么作者需要提醒?

def hash_key(aMap, key): 
    """Given a key this will create a number and then convert it to an index for the aMap's buckets.""" 
    return hash(key) % len(aMap) 

第二个令人困惑的事情对我来说是下一个代码

def get_bucket(aMap, key): 
    """Given a key, find the bucket where it would go.""" 
    bucket_id = hash_key(aMap, key) 
    return aMap[bucket_id] 

在我的理解,bucket_id应该等于hash(key) % len(aMap)价值,为什么我们不返回aMap[hash(key)]

+0

也许使用桶理解[哈希](https://en.wikipedia.org/wiki/Hash_table)的想法可能是有用的 – pazitos10

回答

0

Modulo用于限制数字范围。这是一个众所周知的技巧。这样,如果你溢出你“发送”数字回到范围。

假设我想要[0,9)中的数字,并且我有一个哈希生成器,而不是生成[0,100]范围内的数字。如果我使用hash % 10它保证在我预期的范围内。在第一段代码中,这个技巧用于将一个项目与一个存储桶进行匹配,因为散列不一定是有限的,而是存储桶。

第二段代码只是使用受限散列(在存储区范围内)获取存储区。为了理解它,你必须明白,大部分时间哈希映射都适用于桶。 A 哈希映射分布在桶中的项目平均(或接近它)。因此,如果我们重新迭代 - 如果散列值在[0,100]和10个存储区[0,10]范围内,则每个项目的存储区索引可以用hash % 10来计算。这会将每个项目的散列值与想要的范围[0,10)中的一个桶匹配。

相关问题