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

时间:2010-10-05 07:07:09

标签: python list

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

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

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()作为具有两个属性的对象的简写符号。)

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

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

3 个答案:

答案 0 :(得分:4)

对我而言,使用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}

答案 1 :(得分: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)

答案 2 :(得分:0)

您可以在对象中实现de __eq__属性。基于此,您可以使用==运算符比较对象。