2010-10-05 69 views
2

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

(I使用OBJ()作为缩写符号用于具有两个属性的对象。)

看来我不能在大多数set和list函数中使用attrgetter()函数,就像我可以使用sorted()函数一样,所以我无法弄清楚我应该如何执行此操作。我怀疑我可以使用lambda函数,但是我对函数式编程不太熟悉,所以我似乎无法解决这个问题。

天真的解决方案(首先挑选在两个列表中唯一的所有项目,然后将该列表与第二个列表中的剩余项目结合起来)看起来非常冗长,因此Python中必须有一个更简单的方法。

+0

为什么不使用字典? – JoshD 2010-10-05 07:12:06

回答

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} 
+0

好的,谢谢,现在有用!我一直在努力让这个工作整个上午,所以这是很大的帮助! – Makis 2010-10-05 07:54:27

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) 
+0

我接受了蒂姆的回答,因为第一段很容易理解,但也要感谢你的回答。 – Makis 2010-10-05 07:53:52

0

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

相关问题