背景
我有一个列表
。
这个 list
有很多对象。每个对象都有一个 id
。现在对象是不同的类型。
objects = [Aobject, Bobject, Cobject]
在哪里
>>> Aobject != Bobject
True
>>> Aobject.id == Bobject.id
True
问题
我想要一个基于 object.id
的唯一对象的 list
。
类似这样的:
set(objects, key=operator.attrgetter('id'))
(这不起作用。但我想要这样的东西)
最佳答案
seen = set()
# never use list as a variable name
[seen.add(obj.id) or obj for obj in mylist if obj.id not in seen]
这是可行的,因为 set.add
返回 None
,所以列表推导式中的表达式总是产生 obj
,但前提是 obj.id
尚未添加到 seen
。
(如果 obj 为 None
,则表达式只能计算为 None
;在这种情况下,obj.id
会引发异常。在case mylist
包含 None
值,将测试更改为 if obj and (obj.id not in seen)
)
请注意,这将为您提供列表中具有给定 ID 的第一个对象。 @Abhijit 的回答会给你最后一个这样的对象。
更新:
或者,ordereddict 可能是一个不错的选择:
import collections
seen = collections.OrderedDict()
for obj in mylist:
# eliminate this check if you want the last item
if obj.id not in seen:
seen[obj.id] = obj
list(seen.values())
关于python - 如何获取具有唯一属性的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10024646/