【问题标题】:Combining two lists of objects based on an attribute基于属性组合两个对象列表
【发布时间】:2010-10-05 07:07:09
【问题描述】:

Python 中列表或集合用法的每个示例似乎都包含整数的琐碎情况,但我有两个对象列表,其中 name 属性定义两个对象实例是否“相同”(其他属性可能具有不同的值) .

我可以创建一个列表,其中包含两个列表中的所有项目,排序后,使用

tmpList = sorted(list1 + list2, key=attrgetter('name'))

但我该如何做同样的事情,以便从第二个列表中选择 name 属性中具有相同值的列表项?

例如结合这两个列表

list1 = [obj('Harry',18), obj('Mary',27), obj('Tim', 7)]
list2 = [obj('Harry', 22), obj('Mary', 27), obj('Frank', 40)]

会导致

list = [obj('Harry',22), obj('Mary', 27), obj('Tim', 7), obj('Frank', 40)]

(我使用 obj() 作为具有两个属性的对象的简写符号。)

似乎我不能在大多数 set 和 list 函数中使用 attrgetter() 函数,就像我可以使用 sorted() 函数一样,所以我无法弄清楚我应该如何做到这一点。我怀疑我可以使用 lambda 函数,但我对函数式编程不太熟悉,所以我似乎无法弄清楚。

天真的解决方案(首先选择两个列表中唯一的所有项目,然后将该列表与第二个列表的剩余内容组合)似乎很冗长,因此在 Python 中必须有一个更简单的方法。

【问题讨论】:

    标签: python list


    【解决方案1】:

    在我看来,您最好使用dict 而不是列表,使用名称作为键,将对象的其余部分作为值。然后你可以简单地dict1.update(dict2)

    >>> dict1 = {"Harry": 18, "Mary": 27, "Tim": 7}
    >>> dict2 = {"Harry": 22, "Mary": 27, "Frank": 40}
    >>> dict1.update(dict2)
    >>> dict1
    {'Tim': 7, 'Harry': 22, 'Frank': 40, 'Mary': 27}
    

    【讨论】:

    • 好的,谢谢,现在可以了!我整个早上都在努力让它工作,所以这对我很有帮助!
    【解决方案2】:

    是的。最简单的方法是字典。

    list1 = {"Harry": 18, "Mary": 27, "Tim": 7}
    list2 = {"Harry": 22, "Mary": 27, "Frank": 40}
    
    list1.update(list2)
    

    列表现在是{'Harry':22, 'Mary': 27, 'Tim': 7, 'Frank': 40}

    如果您的数据不仅仅是一个数字,那也没关系。您可以将任何类型的对象作为字典的值。

    list1['Harry'] = (1,"weee",54.55)
    

    【讨论】:

    • 我接受了蒂姆的回答,因为第一段让我更容易理解,但也感谢您的回答。
    【解决方案3】:

    您可以在您的对象中实现 de __eq__ 属性。基于此,您可以将您的对象与 == 运算符进行比较。

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2018-04-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多