Python 基于对象属性统一对象列表的最快方法
Im当前正在根据对象的名称属性对对象列表进行非限定,方法是创建一个对象的dict,并将名称值作为dict键,如下所示:Python 基于对象属性统一对象列表的最快方法,python,list,unique,Python,List,Unique,Im当前正在根据对象的名称属性对对象列表进行非限定,方法是创建一个对象的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() 我想知道是否有一种更快或更像Python的方法来实现这一点。如果两个同名的对象总是被认为是相同的,那
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()
我想知道是否有一种更快或更像Python的方法来实现这一点。如果两个同名的对象总是被认为是相同的,那么您可以相应地实现
\uuuuuuueq\uuuu
和\uuhash\uuuuu
。然后,您的解决方案将与将所有对象存储在集合()中一样简单。
:
将列表转换回集合甚至可能没有必要,因为顺序无论如何都会丢失,因此除非您需要对列表执行某些操作,而不是对集合执行这些操作,否则请继续使用集合。如果始终认为具有相同名称的两个对象是相同的,您可以实现
\uuueq\uu
和\uuuu散列\uuuuuu
相应地。然后,您的解决方案将与将所有对象存储在集合()中一样简单。
:
甚至可能不需要将列表转换回集合,因为顺序已经丢失。因此,除非您需要对列表执行某些操作,但不需要集合,否则请继续使用集合。如果您需要排序:
oset = set()
new_obj_list = []
for o in obj_list:
if o not in oset:
oset.add(o)
new_obj_list.append(o)
如果您需要订购:
oset = set()
new_obj_list = []
for o in obj_list:
if o not in oset:
oset.add(o)
new_obj_list.append(o)
我也会使用set方法,但是我想你希望能够通过名称查找…,但是这里有另一种方法不需要修改类。。。(尽管有点贵)。。。请注意,您可以向排序的
中添加更多排序参数,以便按其他优先级(如年龄或性别等)排序
itertools中也有一个独特的最后一次见到的配方
否则,对于不同的排序要求,将它们作为不同的类方法(或采用已知顺序并调用内部函数的名为“sort”的方法).我也会使用set方法,但我想,您希望能够按名称查找…,但这里有另一种方法不需要修改类。。。(尽管有点贵)。。。请注意,您可以向排序的中添加更多排序参数,以便按其他优先级(如年龄或性别等)排序
itertools中也有一个独特的最后一次见到的配方
否则,对于不同的排序要求,将它们作为不同的类方法(或者称为“sort”的方法,它接受已知的顺序并调用内部函数).正是我的想法,但在iPad上键入答案很慢:)正是我的想法,但在iPad上键入答案很慢:)
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')))}