hash_table 初始化,发生了啥? [复制]
Posted
技术标签:
【中文标题】hash_table 初始化,发生了啥? [复制]【英文标题】:hash_table initialisation, what is happening? [duplicate]hash_table 初始化,发生了什么? [复制] 【发布时间】:2021-04-12 02:43:50 【问题描述】:我有一个关于以下关于哈希表的代码的快速问题。对于第 5 行 - 发生了什么?所以我们将 'hash_table' 初始化为字典。然后对于 nums 中的每个元素 'i' 我们做 hash_table[i]??但是 hash_table 是空的 - 因为刚刚初始化它?这就是我感到困惑的地方。 说我们通过 hash_table['i'] 定义键是否正确?如果是这样,为什么+=1? (PS nums 是一个整数列表)
class Solution:
def singleNumber(self, nums: List[int]) -> int:
hash_table = defaultdict(int)
for i in nums:
hash_table[i] += 1
for i in hash_table:
if hash_table[i] == 1:
return i
【问题讨论】:
这能回答你的问题吗? How does collections.defaultdict work? 这个名字是谁选的?它不是真正的hash_table
,而是一个简单的计数器……
请注意collections.Counter
可能更适合此用例。
【参考方案1】:
我认为您对defaultdict
的理解是正确的:如果密钥不存在,那么密钥将被添加一个默认值。在defaultdict(int)
的情况下,该默认值将是0。但是您传递的nums
是什么?如果nums
不为空,则hash_table
在第一个for
循环后不会为空。但是,方法singleNumber
只返回一个值,这将是hash_table
的第一个键,它只出现在nums
列表中一次。正如 Tomericlo 指出的那样,您的 hash_table
更像是一组计数器,用于计算 nums
中每个不同整数出现的次数。我已修改您的代码以插入 print
语句(并缺少 import
语句)并添加了一个测试用例。
请注意,如果nums
中没有整数只出现一次,那么您的代码永远不会找到匹配项并且永远不会发出return
语句,这相当于返回值None
。
from collections import defaultdict
from typing import List
class Solution:
def singleNumber(self, nums: List[int]) -> int:
hash_table = defaultdict(int)
for i in nums:
hash_table[i] += 1
print(hash_table) # added statement
for i in hash_table:
if hash_table[i] == 1:
return i
# test case:
solution = Solution()
print(solution.singleNumber([7, 6, 7, 12]))
打印:
defaultdict(<class 'int'>, 7: 2, 6: 1, 12: 1)
6
【讨论】:
我认为你错过了问题的重点,即如果在那个时间点hash_table
仍然是空的并且没有密钥 i
,我们怎么能做到 hash_table[i] += 1
。 ..
同样它不返回第一个键,它返回列表中只出现一次的第一个数字
@Tomerikoo 也许吧。但是在执行hash_table[i] += 1
之后,OP 的代码似乎正在寻找1
的值,我从中推断他们希望添加一个默认值 0。此外,OP 会问,“为什么我的 hash_table 是空的?”,我认为这是实际问题。无论如何我已经更新了我的答案,
字典充当一个简单的计数器...列表中的每个数字都对相应的键执行+= 1
。最后,做if hash_table[i] == 1:
意味着该键在原始列表中只出现过一次。尝试输入[7, 7, 6, 6, 12]
@Tomericlo 你是对的。我假设nums
中的每个数字都是不同的。谢谢。以上是关于hash_table 初始化,发生了啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
当您从 Java servlet 中转发 html 页面时,究竟发生了啥? [复制]