2012-08-11 72 views
1

即时通讯目前通过与名称值作为字典键这样创建对象的字典uniquifying根据自己的name属性的对象的列表:最快的方式

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的方式来做到这一点。

+1

这是一个很好的方式。 – Marcin 2012-08-11 13:06:22

回答

12

如果两个具有相同名称的对象应始终视为相同,则可相应地执行__eq____hash__。然后为所有对象存储在set()您的解决方案将是一样容易:

new_obj_list = list(set(obj_list)) 

转换列表回一组甚至可能是不必要的,因为订单总会丢失所以,除非你需要用它做什么只适用于列表,但不适用于集合,只是继续使用集合。

+0

完全是我的想法,但在iPad上输入答案很慢:) – orlp 2012-08-11 12:59:47

1

如果你需要订购:

oset = set() 
new_obj_list = [] 
for o in obj_list: 
    if o not in oset: 
     oset.add(o) 
     new_obj_list.append(o) 
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中还有一个独特的最后看到的食谱。

否则,对于不同的排序要求,把它们作为不同类的方法,(或者一个叫“排序”,需要一个已知顺序和调用的内部函数)...