我有一个对象列表,我希望以这样的方式筛选列表,结果是每个属性值只出现一次。
例如,假设我有三个物体

obj1.my_attr = 'a'
obj2.my_attr = 'b'
obj3.my_attr = 'b'

obj_list = [obj1, obj2, obj3]

最后,我想得到。实际上,顺序并不重要,所以[obj1, obj2]也很好。
首先,我想到了典型的命令式笨拙的方法,比如:
record = set()
result = []

for obj in obj_list:
    if obj.my_attr not in record:
        record.add(obj.my_attr)
        result.append(obj)

然后,通过将其映射到字典,使用键覆盖任何以前的条目,最后提取值:
result = {obj.my_attr: obj for obj in obj_list}.values()

这个看起来不错,但我想知道是否有更优雅、更有效或更实用的方法来实现这个目标。也许是藏在标准图书馆里的甜蜜的东西…事先谢谢。

最佳答案

如果要在python中使用函数式编程样式,您可能需要签出toolz包。使用toolz,您可以简单地执行以下操作:

toolz.unique(obj_list, key=lambda x: x.my_attr)

为了获得更好的性能,可以使用operator.attrgetter('my_attr')代替键的lambda函数。您还可以使用cytoolz,这是用cython编写的toolz的快速实现。

关于python - 按对象属性从列表中删除重复项的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24614192/

10-12 22:30