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