比较列表中对象的属性?

时间:2015-03-29 22:34:11

标签: python list object

我尝试将textMessage个对象列表排序到多个列表中。 每个textMessage都有三个字段 - 发件人的地址,发送的时间以及邮件正文。

我有listOfContacts,其中包含Contact个对象。每个Contact对象都有两个字段 - 联系人的name和该联系人的listOfTextslistOfTexts填充了textMessage个对象的列表。

我在排序功能方面遇到了麻烦。给定一个文本列表,如果联系人尚未在列表中,我希望它向Contact添加新的listOfContacts对象。否则,我想将textMessage对象附加到listOfTextsContact内的listOfContacts

我很难看到联系人是否已经出现在listOfContacts

def sortObjectArray(textArray):
    listOfContacts = []
    emptyList = []
    for text in TextArray:                    # For each text in the sorted array
        if text.address in listOfContacts.name:    # if the text's address is in list of contacts
            addText(text)                           # add the text to the list of texts in contact's class
        else:
            listOfContacts.append(Contact(text.get("address"), emptyList) #if address not in list of contacts, construct one with an empty list of texts.

我认为if text.address in listOfContacts.name应检查Contact中是否存在name n字段为listOfContacts的{​​{1}},其中n是短信的发件人。

我是以错误的方式解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

列表对象没有包含对象的属性。考虑以下绝对有效的python列表:

list_ = ["ah", 12, object(), lambda honey: str(honey) ]

并告诉我原因

if "ah" in list_.lower():

应该有一个明确的行为。

您要做的是让列表中的对象按其名称进行处理,并从中构建set

编辑:hashable意味着您实现__hash__函数,在这种情况下可能只是

class Contact(object):
    def __hash__(self):
        return self.name.__hash__

此外,您应该定义一个__eq__函数(例如相等),以便python可以检查两个联系人是否相等:

    def __eq__(self,other):
         return self.name==other.name

只要你这样做,就可以使用set类型,就像list类型一样,但只允许一个“相等”的对象。这对联系人列表很有意义!完成后,您可以创建一个虚拟的Contact对象,并检查它是否在集合中。

那,或者你只需​​要迭代所有这些:

if any(text.address == cont.name for contact in listOfContacts):

编辑:只检查any个联系人的name属性是否等于text.address

答案 1 :(得分:0)

您可能遇到的第一个问题是listOfContacts没有name属性,因为它是一个列表而不是Contact对象。您可以创建一个新的联系人名称列表,用于检查地址是否已存在。

def sortObjectArray(textArray):
    listOfContacts = []
    contact_names = []
    ...
    for text in TextArray:                    # For each text in the sorted array
        if text.address in contact_names:    # if the text's address is in list of contacts
            ...
        else:
            contact_names.append(text.address)
            listOfContacts.append(Contact(text.get("address"), emptyList) #if address not in list of contacts, construct one with an empty list of texts.