最快的方式
问题描述:
即时通讯目前通过与名称值作为字典键这样创建对象的字典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的方式来做到这一点。
答
如果两个具有相同名称的对象应始终视为相同,则可相应地执行__eq__
和__hash__
。然后为所有对象存储在set()
您的解决方案将是一样容易:
new_obj_list = list(set(obj_list))
转换列表回一组甚至可能是不必要的,因为订单总会丢失所以,除非你需要用它做什么只适用于列表,但不适用于集合,只是继续使用集合。
+0
完全是我的想法,但在iPad上输入答案很慢:) – orlp 2012-08-11 12:59:47
答
如果你需要订购:
oset = set()
new_obj_list = []
for o in obj_list:
if o not in oset:
oset.add(o)
new_obj_list.append(o)
答
我还要去设定的做法,但后来想通要能够查找的名字我猜...,但这里是没有按另一种方法不需要修改课程...(虽然有点贵)...请注意,您可以将其他排序参数添加到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中还有一个独特的最后看到的食谱。
否则,对于不同的排序要求,把它们作为不同类的方法,(或者一个叫“排序”,需要一个已知顺序和调用的内部函数)...
这是一个很好的方式。 – Marcin 2012-08-11 13:06:22