2017-09-11 201 views
0

我試圖在索引中打印對象時發生此錯誤..我正在嘗試搜索lname並打印其對象值...TypeError:'collections.defaultdict'對象不可調用

from collections import defaultdict 
class Pbook(object): 
    lname_index = defaultdict(list) 

    def __init__(self, lname, fname, age): 
     self.lname=lname 
     self.fname=fname 
     self.age=age 
     Pbook.lname_index[lname].append(self) 

    def __str__(self): 
     return "%s %s %s" % (self.lname, self.fname, self.age) 



myList = [] 
myList.append(Pbook("john","smith",23)) 
myList.append(Pbook("george","bush",25)) 

print Pbook.lname_index 

defaultdict(, {'bush': [<main.Pbook object at 0x000000000585EC50>], 'smith': [<main.Pbook object at 0x000000000585EC88>]})

if "bush" in Pbook.lname_index: 
    print "found" 

發現

if "bush" in Pbook.lname_index: 
    print Pbook.lname_index(myList) 

TypeError: 'collections.defaultdict' object is not callable

+0

這本字典是不可調用的,因爲如果你使用'd.get你不能另一方面使用以下語法'd()'(注意圓括弧) ()'那麼函數是可調用的。我感到困惑的是,'myList'是什麼?因爲我認爲它必須是該字典的關鍵? – Chinny84

+0

僅供參考 - 'defaultdict(list)'基本上是說當你試圖使用一個不存在於dict(d)中的關鍵字時,你將創建一個鍵值對''('new_key',[])''除了defaultdict對象的創建之外,您沒有在該列表中傳入該列表。 – Chinny84

回答

0
  1. myList的數據類型爲list。這永遠不能用作字典的關鍵。拇指規則是鍵應該是可散列的,因此我們使用字典鍵作爲string,numberstuples這些都是immutable

  2. 正如dict指出的,應該用[]或使用.get()來訪問。

示例代碼

from collections import defaultdict 
class Pbook(object): 
    lname_index = defaultdict(list) 

    def __init__(self, lname, fname, age): 
     self.lname=lname 
     self.fname=fname 
     self.age=age 
     Pbook.lname_index[lname].append(self) 

    def __str__(self): 
     return "%s %s %s" % (self.lname, self.fname, self.age) 



myList = [] 
myList.append(Pbook("john","smith",23)) 
myList.append(Pbook("george","bush",25)) 

print Pbook.lname_index.get("john") 
print Pbook.lname_index.get("george") 
print Pbook.lname_index.get("bush", None) 
+0

有沒有其他方式爲myList有每個對象的索引?我想在myList中的所有對象中搜索lname並返回該lname所屬的值。我不得不使用defaultdict(list)的原因是我使用lname作爲myList中每個對象的索引。 –