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 初始化,发生了啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当存储非指针值时,C 中实际发生了啥? [复制]

当您从 Java servlet 中转发 html 页面时,究竟发生了啥? [复制]

Xcode 4.2 中基于 Windows 的应用程序发生了啥? [复制]

C++ 向量初始化:使用这种语法到底发生了啥? [关闭]

“是初始视图控制器”复选框发生了啥?

如何判断调用函数时引用了啥? [复制]