我目前正在根据名称属性取消对象列表,通过创建一个名为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方法来做到这一点。
答案 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',它采用已知的顺序并调用内部函数)......