【发布时间】:2022-02-03 01:11:17
【问题描述】:
我正在尝试在 Python 中实现哈希表/哈希映射。
假设我使用元组作为键:
hashTable = {}
node = [1, 2, 3]
print(hashTable[tuple(node)]) # throws an error
hashTable[tuple(node)] = True
print(hashTable[tuple(node)]) # prints TRUE
我想在添加之前检查 hashTable 中是否存在元素。我尝试使用所有 False 值初始化字典。
hashTable = {}
for i in range(1000):
hashTable[i] = False
因此,这将创建一个大小为 1000 的哈希表,其中每个插槽都设置为 FALSE。但是,如果我尝试检查哈希表中是否存在不存在的元素:
print(hashTable[tuple(node)])
我得到了和以前一样的错误。
如何做到这一点?我认为这可以使用in 遍历字典,但这不会首先破坏使用哈希表的全部目的吗?
【问题讨论】:
-
“我认为这可以通过 in 迭代 dict 来工作,但这不会首先破坏使用哈希表的全部目的吗?”不,你为什么认为它会那样工作???有效检查字典成员资格的方法是使用
key in my_dict。 -
所有字典键查找是
O(1)(假设你自己没有写一个)。另请注意,in不会迭代字典。 -
您对
hashTable的实例化创建了一个int: bool形式的Python 字典,这意味着当您访问其中的一个元素时,您会执行hashTable[SOME_NUMBER]那么您为什么要查找一个元组呢? -
除了下面的好答案之外,如果您确实需要使用默认值初始化不存在的键,请使用 defaultdict 而不是插入所有可能的值。
-
@martineau 并不是全部。哈希计算可能需要任意长的时间,哈希冲突可以使搜索线性时间,并且匹配哈希需要通过相等性检查来确认,因此它还取决于对象比较的速度。 (当然在大多数情况下,我也认为它是 O(1),只是说因为你强调了这么多)。
标签: python dictionary hashtable