Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于对象属性统一对象列表的最快方法_Python_List_Unique - Fatal编程技术网

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

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的方法来实现这一点。如果两个同名的对象总是被认为是相同的,那

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的方法来实现这一点。

如果两个同名的对象总是被认为是相同的,那么您可以相应地实现
\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')))}