背景
我有一个list
.
This list
有很多对象。每个对象都有一个id
。现在对象有不同的类型。
objects = [Aobject, Bobject, Cobject]
where
>>> Aobject != Bobject
True
>>> Aobject.id == Bobject.id
True
Problem
我想要一个list
基于的独特对象object.id
.
像这样的事情:
set(objects, key=operator.attrgetter('id'))
(这不起作用。但我想要这样的东西)
您可以使用set
:
seen = set()
uniqueidlist = []
for obj in mylist:
if obj.id not in seen:
seen.add(obj.id)
uniqueidlist.append(obj)
或者等价地:
seen = set()
uniqueidlist = [seen.add(obj.id) or obj for obj in mylist if obj.id not in seen]
这有效是因为set.add
回报None
,所以列表推导式中的表达式总是产生obj
,但前提是obj.id
尚未添加到seen
.
该表达式只能计算为None
if obj is None
;在这种情况下,obj.id
会引发异常。以防万一mylist
包含None
值,将测试更改为if obj and (obj.id not in seen)
.
请注意,对于每个obj.id
,这将保留第一个obj
在有那个的列表中obj.id
.
Update
或者,您可以使用dict
:
seen = {}
for obj in mylist:
if obj.id not in seen:
seen[obj.id] = obj
uniqueidlist = list(seen.values())
请注意,对于每个obj.id
,这将保留第一个obj
在有那个的列表中obj.id
。如果您想保留最后一个测试,请删除该测试obj
,或使用@Abhijit的回答 https://stackoverflow.com/a/10025086/2326961.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)