2013-10-17 79 views
0

字典中存在一些奇怪的問題,我試圖從字典中迭代對傳遞給另一個函數。儘管由於某種原因,迭代器的循環總是返回空值。使用.iteritems()方法迭代字典時出現空值

下面是代碼:

def LinktoCentral(self, linkmethod): 
    if linkmethod == 'sim': 
     linkworker = Linker.SimilarityLinker() 
     matchlist = [] 

     for k,v in self.ToBeMatchedTable.iteritems(): 

      matchlist.append(k, linkworker.GetBestMatch(v, self.CentralDataTable.items())) 

現在,如果我插入上面的印刷線循環:

matchlist = [] 
print self.ToBeMatchedTable.items()   
for k,v in self.ToBeMatchedTable.iteritems(): 

      matchlist.append(k, linkworker.GetBestMatch(v, self.CentralDataTable.items())) 

我得到的應該是印刷出來的字典中的數據。字典的值是列表對象。一個例子元組印刷正上方的for循環,當我從字典中獲得:

>>> (1, ['AARP/United Health Care', '8002277789', 'PO Box 740819', 'Atlanta', 'GA','30374-0819', 'Paper', '3676']) 

然而,在for循環給出空列表到linkworker.GetBestMatch方法。如果我把打印線正下方的for循環,這裏是我得到:

代碼:第一次迭代的

matchlist = [] 

     for k,v in self.ToBeMatchedTable.iteritems(): 
      print self.ToBeMatchedTable.items() 
      matchlist.append(k, linkworker.GetBestMatch(v, self.CentralDataTable.items())) 

      ## Place holder for line to send match list to display window 
     return matchlist 

結果:

>>> (0, ['', '', '', '', '', '', '', '']) 

我真的不知道怎麼回事在執行此循環時,沒有其他任何事情正在進行。我犯的任何愚蠢的錯誤?

+0

如何填充self.ToBeMatchedTable?另外,.iteritems()現在已被棄用,應該用簡單的.items()來替換。 for k,v in d.items():pass – bcollins

+0

你能提供一個完整的例子嗎? – longhua

+0

@bcollins不推薦使用 - 在Python 3.x中不需要它 - 它在2.x中保持完全有效,其中將其切換到items()與Python 3.x版本完全不同 –

回答

1

假設如下:

d = {1: [1,2,3,4,54,6,7,8]} 

print d.items() 

for k,v in d.iteritems(): 
    print k, v 

Output: 
[(1, [1, 2, 3, 4, 54, 6, 7, 8])] 
1 [1, 2, 3, 4, 54, 6, 7, 8] 

self.ToBeMatchedTable有超過one pair的key和value 通常Python dictionariesunordered,當您嘗試訪問它, 它以隨機的方式工作

在你的情況:

有一個關鍵值對,如(0, ['', '', '', '', '', '', '', '']),所以第二次,你有這個!

似乎是在你的代碼的問題:

matchlist.append(k, linkworker.GetBestMatch(v, self.CentralDataTable.items()))

我有模擬類似上述行

>>> l = [] 
>>> 
>>> l.append(1, 2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: append() takes exactly one argument (2 given) 

儘量評論或修改您matchlist.append(...)線的東西:

matchlist.append((k, linkworker.GetBestMatch(v, self.CentralDataTable.items())))

+0

太棒了,謝謝!這是問題所在,實際上有一堆空集,每當我運行它時,它實際上會到附加行,它會拋出異常,但它將被埋在打印到GetBestMatch方法的命令行的異常中,而不喜歡空「v」的值。 – ptpatil