询问有关Python值的“可持续”

时间:2010-08-11 16:35:07

标签: python

我有兴趣采取一个任意的词典并将其复制到一个新的词典中,并在此过程中进行变异。

我想做的一个突变是交换键和值。不幸的是,有些价值观本身就是决定性的。但是,这会生成“不可用类型:'dict'”错误。我真的不介意只是将值字符串化并给它键。但是,我希望能够做到这样的事情:

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

是否有一种干净的方法来执行此操作涉及捕获异常并解析消息字符串中的“unhashable type”?

5 个答案:

答案 0 :(得分:48)

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

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

__hash__的文档中也简要提到了这种方法。

  

这样做意味着当程序尝试检索其哈希值时,不仅类的实例会引发适当的TypeError,而且在检查isinstance(obj, collections.Hashable)时它们也将被正确识别为不可用(不同于定义自己的__hash__()以明确提出TypeError)的类。

答案 1 :(得分:17)

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

答案 2 :(得分: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

答案 3 :(得分:1)

为什么不使用鸭子打字?

for key in olddict:
   try:
       newdict[olddict[key]] = key
   except TypeError:
       newdict[str(olddict[key])] = key

答案 4 :(得分:-2)

我认为最好的解决方案是使用collections.hashable:

import collections
if isinstance(olddict[key], collections.Hashable):
    newdict[olddict[key]] = key
else:
    newdict[str(olddict[key])] = key