从列表中删除重复项的最方便的“Pythonic”方法基本上是:
mylist = list(set(mylist))
但是假设您计算重复项的标准取决于mylist
中包含的对象的特定成员字段。
嗯,一个解决方案就是为__eq__
中的对象定义__hash__
和mylist
,然后经典list(set(mylist))
就可以了。
但有时你的要求需要更多的灵活性。能够创建动态lambda以使用自定义比较例程以不同方式识别重复项将非常方便。理想情况下,如:
mylist = list(set(mylist, key = lambda x: x.firstname))
当然,这实际上并不起作用,因为set
构造函数不采用比较函数,而set
也需要可混合密钥。
那么实现类似功能的最接近的方法是什么,以便您可以使用任意比较函数删除重复项?
答案 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)