询问Python值是否可哈希

69 投票
4 回答
33825 浏览
提问于 2025-04-16 02:38

我想把一个字典(dict)复制到一个新的字典里,并在这个过程中对它进行一些修改。

我想做的一个修改是把键(key)和对应的值(value)互换。不过,有些值本身也是字典,这就导致了一个错误,提示“无法哈希的类型:'dict'”。我其实不介意把这些值转换成字符串,然后用它们作为键。但我希望能有一种方法,像这样:

for key in olddict:
  if hashable(olddict[key]):
    newdict[olddict[key]] = key
  else
    newdict[str(olddict[key])] = key

有没有什么简单的方法可以做到这一点,而不需要捕捉异常并解析错误信息中的“无法哈希的类型”?

4 个回答

4

在Python中,所有可以被哈希的内置对象都有一个叫做.__hash__()的方法。你可以通过这个方法来检查对象是否可哈希。

olddict = {"a":1, "b":{"test":"dict"}, "c":"string", "d":["list"] }

for key in olddict:
   if(olddict[key].__hash__):
      print str(olddict[key]) + " is hashable"
   else: 
      print str(olddict[key]) + " is NOT hashable"

输出结果

1 is hashable
string is hashable
{'test': 'dict'} is NOT hashable
['list'] is NOT hashable
26

当然可以!请看下面的内容:

这个问题主要是关于如何在编程中处理一些特定的情况。很多时候,我们会遇到一些看似复杂的问题,但其实只要理解了基本的概念,就能轻松解决。

在编程中,常常需要使用一些工具和方法来帮助我们完成任务。比如,有时候我们需要从一个地方获取数据,然后把这些数据进行处理,最后再把结果展示出来。这个过程听起来复杂,但实际上就是几个简单的步骤组合在一起。

如果你在编写代码时遇到困难,不妨先把问题拆分成小块,逐步解决。这样不仅能让你更清楚每一步该做什么,还能帮助你找到问题的根源。

总之,编程就像搭积木,先把基础的部分搭好,然后再慢慢加上复杂的结构。只要保持耐心,多加练习,你一定能掌握它!

希望这些解释能帮助你更好地理解编程的世界!

def hashable(v):
    """Determine whether `v` can be hashed."""
    try:
        hash(v)
    except TypeError:
        return False
    return True
79

Python 3.x

可以使用 collections.abc.Hashable 或者 typing.Hashable

>>> import typing
>>> isinstance({}, typing.Hashable)
False
>>> isinstance(0, typing.Hashable)
True

注意:这两个其实是一样的,后者只是前者的一个别名。另外要注意的是,collections.Hashable 在 Python 3.10 及以后版本中被移除了(从 3.7 开始就不推荐使用了)。

Python 2.6+ (原始回答)

从 Python 2.6 开始,你可以使用抽象基类 collections.Hashable

>>> import collections
>>> isinstance({}, collections.Hashable)
False
>>> isinstance(0, collections.Hashable)
True

这种方法在 __hash__ 的文档中也有简单提到。

这样做的好处是,当程序试图获取它们的哈希值时,这个类的实例会抛出合适的 TypeError 错误,而且在检查 isinstance(obj, collections.Hashable) 时,它们也会被正确识别为不可哈希的(这和那些自己定义了 __hash__() 方法并明确抛出 TypeError 的类不同)。

撰写回答