【问题标题】:How do i store multiple object attibutes to a single dictionary key?如何将多个对象属性存储到单个字典键?
【发布时间】:2016-03-04 10:27:15
【问题描述】:

总的来说,我对 python 和编程世界还很陌生,我很少会鼓起勇气问问题,但我被跺脚了,所以我想我应该接受它并寻求帮助。

我正在制作地址簿。

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@email.com')

我的问题是如何将所有这些属性存储在以contact.name 作为键、contact.number 和contact.email 作为值的字典中。

奖金问题。 字典应该在课堂之外,也许在主要功能中? 要么 它是否需要是一个类变量(不完全确定它们是如何工作的) 或对象变量

类似

self.storage = {}

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 如果我有两个不同的朋友叫“Mike”并且希望他们都在我的通讯录中,该怎么办?
  • Kevin 是正确的,您应该使用电子邮件作为主键并使用它进行查找,电子邮件是唯一的
  • 在实际代码名称中是唯一必需的参数。这不是个好主意吗?
  • 世界上有多少约翰?我想我们可以有把握地假设有很多人,有多少人和你有相同的电子邮件?因此,如果名称不唯一,我们最终会用新值覆盖键,但如果您使用唯一标识符作为键,即电子邮件,那么所有用户都将拥有唯一 id,因此我们不会覆盖和丢失数据
  • 考虑到这一点是有道理的。谢谢:)

标签: python arrays oop python-3.x dictionary


【解决方案1】:

如果我将这些信息放入字典中,我会这样做:

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@email.com')

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

但是字典的整个想法是有许多键和对应的值。在这个例子中,它总是只有一个。所以,我想到了另一个模式:

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@email.com')
c2 = Person('Jim','1-700-foo-spam','e111mail@email.com')
c3 = Person('Kim','1-600-foo-spam','e222mail@email.com')

# 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@email.com')
Jim: ('1-700-foo-spam', 'e111mail@email.com')
Kim: ('1-600-foo-spam', 'e222mail@email.com')
"""
for key, val in contacts.items():
    print str(key) + ": " + str(val)

问题标题的答案:值应该是一种对象类型,允许在内部有一个“列表”(即列表、元组、另一个字典或具有多个属性的自定义类型对象。)

【讨论】:

  • 计划是使用 JSON 或 Pickle 将字典写入文本文件。这看起来很有趣。
【解决方案2】:

如果你想让它成为一个类变量,你只需要创建一个空字典作为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)

如您所见,类属性是通过类名访问的,但与其他任何属性一样。如果需要更新它们,可以将它们存储为元组或列表。但是,如果您打算进行更改,最好存储实际的 Person 对象,以免同时更新 Person.storage 和实际的人。这更容易做到:

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

self 指的是使用__init__ 创建的Person 的实例。这就是你的例子中的迈克。然后你可以通过属性访问它们的值:

Person.storage["Mike"].number

正如 Kevin 在评论中指出的那样,您可能想要检测密钥是否已经存在以避免覆盖旧条目(例如,如果字典中已经有 Mike):

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

【讨论】:

  • 如果我需要更改条目应该使用列表而不是元组怎么办?或者我可以更改这些值,因为它存储在字典中?
  • @Chris Ah,是的,如果您打算更新信息,那么我会推荐一个列表,或者更好的是,存储实际的 Person 对象。我已经更新了我的答案。
【解决方案3】:

你可以很容易地拥有一个以元组作为值的字典。

a = {}
a["bob"] = ("1-800-whatever","bob@gmail.com")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多