python通过索引获取字典

时间:2011-08-26 18:16:22

标签: python dictionary subclass

我有从dict继承的子类。在__getitem__方法上,我想检查密钥是否为数字。如果它是数字,我想实现一些其他行为,如果不是,那么我想像往常一样继续。例如:

class M(dict):
   ...
   def __getitem__(self, key):
      if self.isNumber(key):
          print "I am number"
      else:
          # continue the same way as it would have done
   ...

>>> x = M({"name": "Tom", "surname": "Baker", "age": "55"})
>>> print x["name"]
Tom
>>> x[0]
I am number

我该怎么做?

更新

我知道dict中的项目是散列的,因此它不会有序,我所要求的原因是其他原因。因为我确定你仍会问为什么,这就是原因:dict是一个对象,我将通过索引检索与给定对象相关的对象。 (想想父母,孩子的东西)

4 个答案:

答案 0 :(得分:2)

# continue the same way as it would have done

这里使用super()函数。 (这不是开玩笑)
http://docs.python.org/library/functions.html#super

答案 1 :(得分:2)

不确定这是否是你要找的......

class M(dict):

    def __getitem__(self, key):
        try:
            temp = int(key)
            return "I am a number"
        except ValueError:
            return self.get(key, None)

item = M({'one':'1', 'two':'2', '3':'three'})

print item['one']
print item[3]
print item[0]

如@bpgergo所述,您也可以使用super

所以回报看起来像这样:

    except ValueError:
        return super(M, self).__getitem__(key)

这里最大的区别是我的方式(可能很差)抑制因为你试图访问不存在的密钥而引发的任何KeyError。

答案 2 :(得分:1)

为此,您需要在密钥不是数字的情况下调用父类的__getitem__方法。这是通过super()函数完成的。请参阅以下示例:

class cls(dict):
     def __getitem__(self, key):
         if isinstance(numbers.Number):
             print "I am a number"
         else:
             return super(cls, self).__getitem__(key)

答案 3 :(得分:-2)

您需要按字典键的列表进行索引。 例如:

x = dict({"name": "Tom", "surname": "Baker", "age": "55"})
print x[x.keys()[0]]
'55'

编辑:我怀疑,订单无法保证。

  

“键和值以任意顺序列出,非随机,   不同的Python实现,并取决于字典   插入和删除的历史。如果items(),keys(),values(),   使用no调用iteritems(),iterkeys()和itervalues()   对词典的干预修改,列表将直接进行   对应。这允许使用创建(值,键)对   zip():“pairs = zip(a.values(),a.keys())”。同样的关系   保持iterkeys()和itervalues()方法:“pairs =   zip(a.itervalues(),a.iterkeys())“为对提供相同的值。   创建相同列表的另一种方法是“pair = [(v,k)for(k,v)in”   a.iteritems()] “”

来源:http://docs.python.org/release/2.5.2/lib/typesmapping.html

考虑到这一点,我认为最好不要假设字典中的SLA(键的顺序不会改变)