2

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

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

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

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 是 >>>,len(x) 对于实时来说将花费太长时间。

我试过UserDict.DictMixin了,突然就可以了,为什么会这样?:

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

有没有办法让我不使用 Mixin,因为在__future__python3 中,mixin 看起来好像已被弃用?

4

3 回答 3

3

定义以下方法。

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

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

因为为您DictMixin定义了上述__iter__方法。(UserDict.py 源代码。)

于 2013-10-13T10:37:38.217 回答
2

只是分享另一种方式:

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
于 2013-10-13T11:41:00.263 回答
1
def __iter__(self):
    return iter(self.cdict.itervalues())

在 Python3 中,您将values()改为调用。

您是对的,这UserDict.DictMixin已经过时了,但这并不是问题所在,而是collections.Mapping使用collections.MutableMapping更合理的底层接口。因此,如果您想从 更新UserDict.DictMixin,您应该切换到collections.Mapping并实施__iter__()and__len__()而不是keys().

于 2013-10-13T10:26:22.403 回答