我有兴趣采取一个任意的字典并将其复制到一个新的字典中,一路上改变它.
我想做的一个突变是交换键和值.不幸的是,有些价值观本身就是决定性的.但是,这会生成"不可用类型:'dict'"错误.我真的不介意只是将值字符串化并给它键.但是,我希望能够做到这样的事情:
for key in olddict:
if hashable(olddict[key]):
newdict[olddict[key]] = key
else
newdict[str(olddict[key])] = key
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方法来执行此操作,不涉及捕获异常并解析"不可用类型"的消息字符串?
Mar*_*ers 52
从Python 2.6开始,您可以使用抽象基类collections.Hashable:
>>> import collections
>>> isinstance({}, collections.Hashable)
False
>>> isinstance(0, collections.Hashable)
True
Run Code Online (Sandbox Code Playgroud)
在文档中也简要提到了这种方法__hash__.
这样做意味着
TypeError当程序试图检索其哈希值时,不仅类的实例会引发适当的,而且在检查时它们也将被正确识别为不可用isinstance(obj, collections.Hashable)(与定义它们自己的类__hash__()以明确引发的不同TypeError).
Ned*_*der 17
def hashable(v):
"""Determine whether `v` can be hashed."""
try:
hash(v)
except TypeError:
return False
return True
Run Code Online (Sandbox Code Playgroud)
所有内置在 python 对象中的 hashable 都有一个.__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"
Run Code Online (Sandbox Code Playgroud)
输出
1 is hashable
string is hashable
{'test': 'dict'} is NOT hashable
['list'] is NOT hashable
Run Code Online (Sandbox Code Playgroud)