根据属性合并两个对象列表

4 投票
3 回答
4661 浏览
提问于 2025-04-16 05:00

在Python中,使用列表或集合的例子大多都是简单的整数,但我有两个对象列表,这些对象的名字属性决定了它们是否是“相同”的(其他属性可能有不同的值)。

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

tmpList = sorted(list1 + list2, key=attrgetter('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()作为一个简写,表示一个有两个属性的对象。)

我发现大多数集合和列表函数中不能像在sorted()函数中那样使用attrgetter()函数,所以我不知道该怎么做。我怀疑我可以使用一个lambda函数,但我对函数式编程不太熟悉,所以一直搞不明白。

直接的解决办法是先挑出两个列表中独特的所有项目,然后再把这个列表和第二个列表剩下的部分合并,但这似乎太繁琐了,所以在Python中一定有更简单的方法。

3 个回答

0

你可以在你的对象里实现一个叫做 __eq__ 的属性。这样一来,你就可以用 == 运算符来比较这些对象了。

1

没错,最简单的方法就是用字典。

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)
5

听起来你可能用字典(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}

撰写回答