询问Python值是否可哈希
我想把一个字典(dict)复制到一个新的字典里,并在这个过程中对它进行一些修改。
我想做的一个修改是把键(key)和对应的值(value)互换。不过,有些值本身也是字典,这就导致了一个错误,提示“无法哈希的类型:'dict'”。我其实不介意把这些值转换成字符串,然后用它们作为键。但我希望能有一种方法,像这样:
for key in olddict:
if hashable(olddict[key]):
newdict[olddict[key]] = key
else
newdict[str(olddict[key])] = key
有没有什么简单的方法可以做到这一点,而不需要捕捉异常并解析错误信息中的“无法哈希的类型”?
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
当然可以!请看下面的内容:
这个问题主要是关于如何在编程中处理一些特定的情况。很多时候,我们会遇到一些看似复杂的问题,但其实只要理解了基本的概念,就能轻松解决。
在编程中,常常需要使用一些工具和方法来帮助我们完成任务。比如,有时候我们需要从一个地方获取数据,然后把这些数据进行处理,最后再把结果展示出来。这个过程听起来复杂,但实际上就是几个简单的步骤组合在一起。
如果你在编写代码时遇到困难,不妨先把问题拆分成小块,逐步解决。这样不仅能让你更清楚每一步该做什么,还能帮助你找到问题的根源。
总之,编程就像搭积木,先把基础的部分搭好,然后再慢慢加上复杂的结构。只要保持耐心,多加练习,你一定能掌握它!
希望这些解释能帮助你更好地理解编程的世界!
def hashable(v):
"""Determine whether `v` can be hashed."""
try:
hash(v)
except TypeError:
return False
return True
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
的类不同)。