如何在手动实现的哈希表中找到最大值?

时间:2018-05-22 00:32:43

标签: python max hashtable

您好我是Python的新手,我实现了一个哈希表来计算单词中出现的字母数。

例如,哈希表当前存储了这个:

{l:1, r:1, t:1, u:1, a:1, c:1, d:2, e:1, }

我想在哈希表中找到最大值,即2.我实现了一个迭代器,所以我可以遍历哈希表。我设法找到这样的最大值:

编辑:我使用set item,get item functions实现了一个hashtable类。

class HashTableQuadratic:

def __init__(self, size=10):
    self.count = 0
    self.table_size = size
    self.array = build_array(self.table_size)
    self.collision=0
    self.totalProbeLength=0

 //some code here


tempList=[]
for item in hashTable:
if item!=None:
    tempList.append(item[1])
maxNum=max(tempList)
print(maxNum)

但是,如果不使用tempList和max内置函数,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:0)

假设您的课程与collections.Counter相同,您可以这样简单地使用max

max(hashTable.items(), key=lambda item: item[1])

这将以您的示例返回('d', 2)。如果您不想知道哪个密钥具有最大值,则可以简化它。

我们将所有项目作为(key, value)对传递,并使用maxkey参数告诉它按值比较项目。

答案 1 :(得分:0)

您的hashTable对象似乎是可重复的键值对。

首先,不是你的四行代码:

tempList=[]
for item in hashTable:
if item!=None:
    tempList.append(item[1])

......相当于单线理解:

tempList = [item[1] for item in hashTable if item is not None]

将它变成一个懒惰的迭代器而不是在内存中构建一个列表是微不足道的:

it = (item[1] for item in hashTable if item is not None)

您可以直接在max电话中内联:

maxNum = max(item[1] for item in hashTable if item is not None)

作为旁注,请注意我使用的是item is not None而不是item != None。您几乎永远希望与None==进行比较!=。经验法则是:

  • 如果您想要任何真实价值,请使用if item
  • 如果您想要任何非None值,请使用if item is not None
  • 如果您想要任何非None值,同时明确允许其他类覆盖__eq__并且比较等于None,请使用if item != None

但是,值得注意的是,如果你想构建一个自定义哈希表,你可能希望它像dict一样 - 或至少像Mapping。实现Mapping接口非常简单,这意味着您的对象可以作为dict进行duck-type。

而且,如果你这样做,你可以使用与dict一样的代码:

maxNum = max(hashTable.values())