使用自定义比较删除重复项

时间:2012-10-04 15:46:19

标签: python python-3.x

从列表中删除重复项的最方便的“Pythonic”方法基本上是:

mylist = list(set(mylist))

但是假设您计算重复项的标准取决于mylist中包含的对象的特定成员字段。

嗯,一个解决方案就是为__eq__中的对象定义__hash__mylist,然后经典list(set(mylist))就可以了。

但有时你的要求需要更多的灵活性。能够创建动态lambda以使用自定义比较例程以不同方式识别重复项将非常方便。理想情况下,如:

mylist = list(set(mylist, key = lambda x: x.firstname))

当然,这实际上并不起作用,因为set构造函数不采用比较函数,而set也需要可混合密钥。

那么实现类似功能的最接近的方法是什么,以便您可以使用任意比较函数删除重复项?

3 个答案:

答案 0 :(得分:20)

您可以使用dict而不是set,其中dict的键将是唯一值:

d = {x.firstname: x for x in mylist}
mylist = list(d.values())

答案 1 :(得分:1)

我会这样做:

duplicates = set()
newlist = []
for item in mylist:
    if item.firstname not in duplicates:
        newlist.append(item)
        excludes.add(item.firstname)

答案 2 :(得分:0)

如果您需要使用“in”运算符

具有更大的灵活性
def is_in(value, value_list, comparer_function):
    """ checkes whether "value" already in "value_list" """
    for vi in value_list:
        if comparer_function(vi, value):
            return True
    return False

def make_unique_set(in_list, comparer_function=lambda a, b: a == b):
    """ retusn unique set of "in_list" """
    new_list = []
    for i in in_list:
        if not is_in(i, new_list, comparer_function):
            new_list.append(i)
    return new_list

make_unique_set(mylist, comparer_function=lambda a, b : a.firstname == b.firstname)