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

Python 使用自定义比较删除重复项,python,python-3.x,Python,Python 3.x,从列表中删除重复项最方便的“Pythonic”方法基本上是: mylist = list(set(mylist)) 但假设计算重复项的标准取决于mylist中包含的对象的特定成员字段 好的,一种解决方案是只为mylist中的对象定义\uuuuueq\uuuuuu和\uuuuuuuuuu,然后经典的列表(set(mylist))就可以工作了 但有时您的需求需要更大的灵活性。能够动态创建lambda以使用自定义比较例程以不同方式识别重复项将非常方便。理想情况下,类似于: mylist = list

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

mylist = list(set(mylist))
但假设计算重复项的标准取决于
mylist
中包含的对象的特定成员字段

好的,一种解决方案是只为
mylist
中的对象定义
\uuuuueq\uuuuuu
\uuuuuuuuuu
,然后经典的
列表(set(mylist))
就可以工作了

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

mylist = list(set(mylist, key = lambda x: x.firstname))
当然,这实际上不起作用,因为
set
构造函数不使用比较函数,而且
set
也需要哈希键

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

我会这样做:

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

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

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

如果您需要更灵活地使用“in”运算符


这通常是最简单的方法。性能应该与set方法差不多。哇,我以前从未见过语法
{x.firstname:x for x in mylist}
。它叫什么名字?我在哪里可以在文档中找到它。@MarwanAlsabbagh:它是一个。它是在Python2.7和3.0中添加的。它相当于dict((x.firstname,x)在mylist中表示x)。
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)