19

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

mylist = list(set(mylist))

但是假设您计算重复项的标准取决于mylist.

好吧,一种解决方案是只为 中的对象定义__eq__和,然后经典将起作用。__hash__mylistlist(set(mylist))

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

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

当然,这实际上不起作用,因为set构造函数不采用比较函数,并且还set需要可散列键。

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

4

3 回答 3

27

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

d = {x.firstname: x for x in mylist}
mylist = list(d.values())
于 2012-10-04T15:51:35.820 回答
1

我会这样做:

duplicates = set()
newlist = []
for item in mylist:
    if item.firstname not in duplicates:
        newlist.append(item)
        excludes.add(item.firstname)
于 2012-10-04T15:50:47.010 回答
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)
于 2018-02-18T13:58:48.207 回答