【问题标题】:Compare attributes of objects inside a list?比较列表中对象的属性?
【发布时间】:2015-03-29 22:34:11
【问题描述】:

我正在尝试将textMessage 对象列表排序到几个列表中。 每个textMessage 都包含三个字段——发件人地址、发送时间和邮件正文。

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

我在使用排序功能时遇到了问题。给定一个文本列表,如果联系人不在列表中,我希望它向listOfContacts 添加一个新的Contact 对象。否则,我想将textMessage 对象附加到Contact 内部的listOfTexts 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 应该检查n 中是否存在带有name 字段的Contact listOfContacts,其中n 是短信的发件人。

我是不是走错路了?

【问题讨论】:

  • 您可能会遇到的第一个问题是 listOfContacts 没有name 属性,因为它是一个列表而不是Contact 对象
  • 为了清楚起见,列表和数组是不同的东西。虽然 CPython 列表是基于数组的(我假设其他实现也是如此),但它们不是数组(并且 Python 没有数组类型)

标签: python list object


【解决方案1】:

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

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

告诉我为什么

if "ah" in list_.lower():

应该有一个明确的行为。

您想要做的是使列表中的对象可以通过它们的名称进行哈希处理,并从中构建一个set

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

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

另外,你应该定义一个__eq__ 函数(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 的联系人是否具有等于您的text.addressname 属性。

【讨论】:

  • 您不需要生成器表达式中的列表理解。
  • @Dannnno:是的,我正在删除它。
  • 对不起,我对python很陌生,使列表可散列是什么意思?这和把它放进字典一样吗?另外,您能否解释一下您写的那一行,我不确定我是否理解那里发生的事情。
  • @Tryer 你不想让你的列表可以散列。你会想让你的 Contact 对象可散列。这意味着在您的Contact 中实现__hash____eq__
  • @Tryer:已编辑。如果仍有不清楚的地方,您可能需要阅读有关序列类型的 python 标准库文档。
【解决方案2】:

您可能会遇到的第一个问题是 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.

【讨论】:

  • 如果我使用此方法,我将如何调用每个联系人对象所具有的 addText 方法,因为我将引用字符串列表?
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
相关资源
最近更新 更多