2015-11-30 29 views
0

我對python和編程的世界相當陌生,而且很少有人能夠提出問題的神經,但我跺腳,所以我認爲id吸了它並尋求幫助。如何將多個對象屬性存儲到單個字典鍵?

我在製作地址簿。

class Person(): 

    def __init__(self,name,number,email): 
     self.name = name 
     self.number = number 
     self.email = email 
contact = Person('Mike','1-800-foo-spam','[email protected]') 

我的問題是如何將着手在字典中存儲所有這些屬性與contact.name爲重點和contact.number和contact.email的值。

獎金問題。 字典應該在班級之外,也許在主要功能? 或 是否需要一個類變量(不完全確定如何將這些工作) 或一個對象變量

self.storage = {} 

任何幫助將不勝感激。

謝謝!

+0

如果我有兩個名爲「Mike」的不同朋友,並且希望他們都在我的地址簿中,會發生什麼? – Kevin

+0

凱文是正確的,你應該使用電子郵件作爲主鍵,並做了一個查找,電子郵件是唯一的 –

+0

以及在實際的代碼名稱是唯一所需的參數。這不是一個好主意嗎? – Chris

回答

0

如果我在一本字典把這個信息,我會做這樣的:

class Person(): 

    def __init__(self,name,number,email): 
     self.name = name 
     self.number = number 
     self.email = email 
     self.storage = {self.name: [self.number, self.email]} 

    def getStorage(self): 
     return self.storage 

contact = Person('Mike','1-800-foo-spam','[email protected]') 

print contact.storage 
# or 
print contact.getStorage() 

但是字典的整體思路是有一個數字鍵和CORRE的自發的價值。在這個例子中,它總是隻有一個。因此,另一種模式在我腦海中:

class Person(): 

    def __init__(self,name,number,email): 
     self.name = name 
     self.number = number 
     self.email = email 

# creating some example contacts   
c1 = Person('Mike','1-800-foo-spam','[email protected]') 
c2 = Person('Jim','1-700-foo-spam','[email protected]') 
c3 = Person('Kim','1-600-foo-spam','[email protected]') 

# creating a dictionary to fill it with c1..cn contacts 
contacts = {} 

# helper function to automate dictionary filling 
def contactToDict(list_of_contacts): 
    for item in list_of_contacts: 
     contacts[item.name] = (item.number, item.email) 

contactToDict([c1, c2, c3]) 

""" 
expected output: 
Mike: ('1-800-foo-spam', '[email protected]') 
Jim: ('1-700-foo-spam', '[email protected]') 
Kim: ('1-600-foo-spam', '[email protected]') 
""" 
for key, val in contacts.items(): 
    print str(key) + ": " + str(val) 

的問題的答案的標題:值應該是一個類型的對象以允許有一個「清單」內(即列表,元組,另一個字典或具有多個屬性的自定義類型對象)

+0

計劃是使用JSON或Pickle將字典寫入文本文件。這看起來很有趣。 – Chris

0

你可以很容易地將元組作爲值的字典。

a = {} 
a["bob"] = ("1-800-whatever","[email protected]") 
0

如果你想使它成爲一個類變量,你只需要創建一個空的字典作爲Person類的一部分:

class Person(): 

    storage = {} 

然後在__init__您可以存儲新的人該字典中的信息:

def __init__(self,name,number,email): 
    self.name = name 
    self.number = number 
    self.email = email 
    Person.storage[name] = (number, email) 

正如你所看到的,class屬性是用類名訪問的,但是與其他任何屬性一樣。如果需要更新它們,可以將它們作爲元組或列表存儲。但是,如果您打算進行更改,則最好存儲實際的Person對象,以便不必同時更新Person.storage和實際人員。這是更容易做到:

def __init__(self,name,number,email): 
    self.name = name 
    self.number = number 
    self.email = email 
    Person.storage[name] = self 

self指就是BEING與__init__創建的Person實例。在你的例子中,這就是邁克。然後,你可以通過屬性訪問它們的值:

Person.storage["Mike"].number 

而且凱文在評論中指出,你可能要檢測是否鍵已經存在,以避免覆蓋舊條目(例如,如果已經有一個在一個麥克。字典):

self.email = email 
    if name in Person.storage: 
     # Make unique name 
    Person.storage[name] = (number, email) 
+0

如果我需要更改條目,我應該使用列表而不是元組?或者我可以更改值,因爲它存儲在字典中? – Chris

+0

@Chris啊,是的,如果你打算更新信息,那麼我會推薦一個或更好的列表,存儲實際的'人'對象。我已經更新了我的答案。 – SuperBiasedMan

+0

非常感謝你 – Chris

相關問題