通过没有mixin-python的类对象的字典迭代

时间:2013-10-13 10:15:49

标签: python class dictionary iterator mixins

该类的主要功能是一个字典,其中单词作为键 id号作为值(注意:id不是顺序的,因为某些条目被删除):

x = {'foo':0, 'bar':1, 'king':3}

当我为我创建的customdict类编写迭代器函数时,由于KeyError而在迭代range(1 to infinity)时会中断。

class customdict():
    def __init__(self,dic):
        self.cdict = dic
        self.inverse = {}

    def keys(self): 
        # this is necessary when i try to overload the UserDict.Mixin
        return self.cdict.values()

    def __getitem__(self, valueid):
        """ Iterator function of the inversed dictionary """
        if self.inverse == {}:
            self.inverse = {v:k for k,v in self.cdict.items()}
        return self.inverse[valueid]

x = {'foo':0, 'bar':1, 'king':3}
y = customdict(x)

for i in y:
    print i

如果没有try and except并访问len(x),我如何解决customdict类中字典的迭代?原因x是>&gt ;>,len(x)实时需要太长时间。

我已经尝试了UserDict.DictMixin并突然发挥作用,为什么会如此?:

import UserDict.DictMixin
class customdict(UserDict.DictMixin):
 ...

有没有办法让我不使用Mixin,因为在__future__和python3中,mixins看起来已被弃用?

3 个答案:

答案 0 :(得分:2)

定义以下方法。

def __iter__(self):
    for k in self.keys():
        yield k
  

我已经尝试了UserDict.DictMixin并且它突然起作用,为什么会这样?:

因为DictMixin为您定义了上述__iter__方法。 (UserDict.py source code。)

答案 1 :(得分:1)

def __iter__(self):
    return iter(self.cdict.itervalues())

在Python3中,您需要调用values()

你认为UserDict.DictMixin已经过时是正确的,但问题不在于它是一个混合因素,而是collections.Mappingcollections.MutableMapping使用更明智的事实底层接口。因此,如果您想要从UserDict.DictMixin进行更新,则应切换到collections.Mapping并实施__iter__()__len__()而不是keys()

答案 2 :(得分:1)

只是分享另一种方式:

class customdict(dict):
    def __init__(self,dic):
        dict.__init__(self,{v:k for k,v in dic.items()})        

x = {'foo':0, 'bar':1, 'king':3}
y = customdict(x)


for i in y:
    print i,y[i]

<强>结果:

0 foo
1 bar
3 king