我尝试将textMessage
个对象列表排序到多个列表中。
每个textMessage
都有三个字段 - 发件人的地址,发送的时间以及邮件正文。
我有listOfContacts
,其中包含Contact
个对象。每个Contact
对象都有两个字段 - 联系人的name
和该联系人的listOfTexts
。 listOfTexts
填充了textMessage
个对象的列表。
我在排序功能方面遇到了麻烦。给定一个文本列表,如果联系人尚未在列表中,我希望它向Contact
添加新的listOfContacts
对象。否则,我想将textMessage
对象附加到listOfTexts
内Contact
内的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
是短信的发件人。
我是以错误的方式解决这个问题吗?
答案 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.