基于对象属性统一对象列表的最快方法

时间:2012-08-11 12:55:38

标签: python list unique

我目前正在根据名称属性取消对象列表,通过创建一个名为value的对象的dict作为dict键,如下所示:

obj_dict = dict()

for obj in obj_list:
    if not obj.name in obj_dict:
        obj_dict[obj.name] = obj

new_obj_list = obj_dict.items()

我想知道是否有更快或更多的pythonic方法来做到这一点。

3 个答案:

答案 0 :(得分:12)

如果两个具有相同名称的对象应始终视为相同,则可以相应地实现__eq____hash__。然后,您的解决方案就像将所有对象存储在set()

中一样简单
new_obj_list = list(set(obj_list))

将列表转换回集合可能甚至没有必要,因为订单总是会丢失,所以除非你需要对它做一些只适用于列表但不使用集合的东西,只需继续使用该集合。

答案 1 :(得分:1)

如果您需要订购:

oset = set()
new_obj_list = []
for o in obj_list:
    if o not in oset:
        oset.add(o)
        new_obj_list.append(o)

答案 2 :(得分:0)

我也会采用设定的方法,但后来认为你希望能够按名称查找我猜...但是这里是另一种不需要修改课程的方法......(尽管多一点昂贵)...请注意,您可以向sorted添加更多排序参数,以便按其他优先级(例如年龄,性别等等)进行排序。

from operator import attrgetter
from itetools import groupby
unique_by_name = {key: next(item) for key, item in groupby(attrgetter('name'), sorted(obj_list, key=attrgetter('name')))}

在itertools中也有一个独特的最后见过的食谱。

否则对于不同的排序要求,将它们作为不同的类方法,(或者称为'sort',它采用已知的顺序并调用内部函数)......