【问题标题】:Fastest way to uniquify a list of objects based on object attribute基于对象属性唯一化对象列表的最快方法
【发布时间】:2012-08-11 12:55:38
【问题描述】:

我目前通过创建一个对象的字典,将对象的名称值作为字典键,基于它们的名称属性来唯一化一个对象列表,如下所示:

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 list unique


    【解决方案1】:

    如果两个具有相同名称的对象总是被认为是相同的,您可以相应地实现__eq____hash__。那么您的解决方案就像将所有对象存储在 set() 中一样简单:

    new_obj_list = list(set(obj_list))
    

    可能甚至不需要将列表转换回集合,因为无论如何订单都会丢失,所以除非您需要对它做一些仅适用于列表但不适用于集合的操作,否则请继续使用该集合。

    【讨论】:

    • 正是我的想法,但在 iPad 上输入答案很慢 :)
    【解决方案2】:

    如果您需要订购:

    oset = set()
    new_obj_list = []
    for o in obj_list:
        if o not in oset:
            oset.add(o)
            new_obj_list.append(o)
    

    【讨论】:

      【解决方案3】:

      我也将采用 set 方法,但后来我想您希望能够按名称查找...,但这是另一种不需要修改类的方法...(尽管多一点昂贵)...请注意,您可以向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 中也有一个独特的最后一次看到的配方。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-18
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        相关资源
        最近更新 更多