python - 如何获取具有唯一属性的对象列表

标签 python list set

背景

我有一个列表。 这个 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/

相关文章:

python - 在 map 上绘制洋流数据 : Too many value to unpack error

java - 如何在Java中的单个列表中存储多个数据库列值

c# - 如何根据属性合并两个对象列表并将重复项合并到新对象中

Python - 套接字错误,地址正在使用

python - Python3 中的 mimetools.choose_boundary 函数在哪里?

python - Numpy:将稀疏矩阵转换为 ndarray

javascript - JavaScript 中有 Set 字面量吗?

python - 在 Python 中格式化列表

Python:使用集合检测重复项

r - 数据帧的负运算