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