2015-01-02 128 views
1

我试着去ITER在我的字典期运用这样的:字典迭代与ITER FUNC

it = iter(db) 
for i in it: 
    print(i) 

但是当我运行该发生的事情是印刷字典作为一个整体而不是上的按键的无限循环字典

我用这个作为输入:

ppl = Course(123, 'Principles of Programming Languages') 
os = Course(133, 'Operating Systems') 
db = DB() 
db.setCourse(ppl, 'SE', 2, 1) 
db.setCourse(os, 'SE', 3, 1) 

和我的输出是:

{123: ('Principles of Programming Languages', 'SE', 2, 1), 133: ('Operating Systems', 'SE', 3, 1)} 
{123: ('Principles of Programming Languages', 'SE', 2, 1), 133: ('Operating Systems', 'SE', 3, 1)} 
{123: ('Principles of Programming Languages', 'SE', 2, 1), 133: ('Operating Systems', 'SE', 3, 1)} 

在一个永无止境的循环中。 即时通讯很确定我的下一个是搞砸了。

编辑 数据库代码很长,这是它的ITER部分:

class DB() 
    DataBase = {} 
    def __iter__(self): 
     return iter(self.DataBase) 
    def getCourse(self,cnum): 
     for i in self.DataBase: 
      if i == cnum: 
       return self.DataBase[i] 
    def getCoursesByDept(self,dept): 
     for key, value in self.DataBase.items(): 
      if dept in value: 
       return self.DataBase[key] 
    def getCoursesByDeptYear(self,dept,year): 
     for key, value in self.DataBase.items(): 
      if dept in value and year in value: 
       return self.DataBase[key] 
    def getCoursesByDeptYearSem(self,dept,year,semester): 
     for key, value in self.DataBase.items(): 
      if dept in value and year in value and semester in value: 
       return self.DataBase[key] 
    def setCourse(self,Course,dept,year,semester): 
     self.DataBase[Course.cnum] = (Course.name,dept,year,semester) 
    def removeCourse(self,cnum): 
     for i in self.DataBase.keys(): 
      if i == cnum: 
       del self.DataBase[i] 

正确的输出是:

Course 123: Principles of Programming Languages 
Course 133: Operating Systems 
+2

你忘了分享'DB'类的代码。 –

+0

对不起,我无法重现该问题。另外,你不需要单独的'iter' – thefourtheye

+0

预期的结果是什么? – bereal

回答

2

貌似最简单的解决方法是:

class DB(): 
    ... 
    def __iter__(self): 
     return iter(self.DataBase) 

并取出__next__方法。

要创建自己的,你需要在你__iter__通过按键自行行走:

def __iter__(self): 
     for key in self.Database: 
      yield key 

它创建了一个发电机,你仍然不需要__next__;如果你__next__,那么你需要收集密钥,然后逐一返回。

一旦你已经返回每一个键,每次需要raise StopIteration__next__再次被调用 - 意味着你只能迭代一次 - 更好地坚持上述两个选项之一。

你目前得到一个无限循环的原因是每次调用__next__时都返回整个字典 - 不检查是否完成。

有关创建迭代器的更全面解释,请参见this answer


如果你希望你的DB类看起来相同的dict,再加入keys()items()values();如果你不关心或不需要这些,那么无论是上面的第二个选项,还是创建你自己的。第二个选项可能看起来像:

def __iter__(self): 
     for key, value in self.Database.items(): 
      yield key, value 

这里发生的是,每keyvalue一对DB,都是回报迭代时。所以你的原始循环应该是这样的:

it = iter(db) 
for k, v in it: 
    print('%s: %s' % (k, v)) 
+0

这只返回我的密钥,我必须在代码中的某处另一个问题。 –

+0

@ Mike.G:当迭代一个字典时,键是返回的 - 还有其他方法可以返回其他的东西:'.values()'返回值,'__items__'返回项目。 –

+0

我明白了,那我该如何改变它以让我回到理想的输出? –