该类的主要功能是一个字典,其中单词作为键, 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看起来已被弃用?
答案 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.Mapping
和collections.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