2015-01-02 129 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

我明白了,那我該如何改變它以讓我回到理想的輸出? –