在 Python 的列表中删除重复对象的快速方法
Quick way to remove duplicate objects in a List in Python
我有一个 MyClass 对象列表,它是这样制作的:
# The class is MyClass(string_a: str = None, string_b: str = None)
test_list: List[MyClass] = []
test_clist.append(MyClass("hello", "world"))
test_clist.append(MyClass("hello", ""))
test_clist.append(MyClass("hello", "world"))
test_clist.append(MyClass(None, "world")
我希望最终结果只删除第三个附加项:
# Remove test_clist.append(MyClass("hello", "world"))
这只是一个示例,对象列表在列表或 n 中不能没有任何内容。有没有办法快速删除它们或更好的方法,比如如何在附加之前快速判断它是否已经存在?
如果你的对象是原始类型,你可以使用set
list(set(test_clist))
如果不是,就像你的情况一样,那么你有 2 个解决方案
1- 实施 __hash__()
& __eq__()
您必须在 class 中实施 __hash__()
& __eq__
才能使用 set()
删除重复项
见下例
class MyClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"MyClass({self.x} - {self.y})"
def __hash__(self):
return hash((self.x, self.y))
def __eq__(self, other):
if self.__class__ != other.__class__:
return NotImplemented
return (
self.x == other.x and
self.y == other.y
)
l = []
l.append(MyClass('hello', 'world'))
l.append(MyClass('hello', 'world'))
l.append(MyClass('', 'world'))
l.append(MyClass(None, 'world'))
print(list(set(l)))
由于您有多个要在比较中使用的键,__hash__()
使用一个键元组。
__repr__()
只是为了将 class 的对象表示为字符串。
2- 使用第三方包
签出一个名为 toolz
的包裹
然后使用unique()
方法通过传递一个键来删除重复项
toolz.unique(test_list, key=lambda x: x.your_attribute)
在你的例子中,你有多个属性,所以你可以将它们组合成一个,例如通过为它们创建一个串联的 属性 然后将它作为你的密钥传递给 toolz.unique()
,或者像下面这样动态地连接它们
toolz.unique(test_list, key=lambda x: x.first_attribute + x.second_attribute)
我有一个 MyClass 对象列表,它是这样制作的:
# The class is MyClass(string_a: str = None, string_b: str = None)
test_list: List[MyClass] = []
test_clist.append(MyClass("hello", "world"))
test_clist.append(MyClass("hello", ""))
test_clist.append(MyClass("hello", "world"))
test_clist.append(MyClass(None, "world")
我希望最终结果只删除第三个附加项:
# Remove test_clist.append(MyClass("hello", "world"))
这只是一个示例,对象列表在列表或 n 中不能没有任何内容。有没有办法快速删除它们或更好的方法,比如如何在附加之前快速判断它是否已经存在?
如果你的对象是原始类型,你可以使用set
list(set(test_clist))
如果不是,就像你的情况一样,那么你有 2 个解决方案
1- 实施 __hash__()
& __eq__()
您必须在 class 中实施 __hash__()
& __eq__
才能使用 set()
删除重复项
见下例
class MyClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"MyClass({self.x} - {self.y})"
def __hash__(self):
return hash((self.x, self.y))
def __eq__(self, other):
if self.__class__ != other.__class__:
return NotImplemented
return (
self.x == other.x and
self.y == other.y
)
l = []
l.append(MyClass('hello', 'world'))
l.append(MyClass('hello', 'world'))
l.append(MyClass('', 'world'))
l.append(MyClass(None, 'world'))
print(list(set(l)))
由于您有多个要在比较中使用的键,__hash__()
使用一个键元组。
__repr__()
只是为了将 class 的对象表示为字符串。
2- 使用第三方包
签出一个名为 toolz
的包裹然后使用unique()
方法通过传递一个键来删除重复项
toolz.unique(test_list, key=lambda x: x.your_attribute)
在你的例子中,你有多个属性,所以你可以将它们组合成一个,例如通过为它们创建一个串联的 属性 然后将它作为你的密钥传递给 toolz.unique()
,或者像下面这样动态地连接它们
toolz.unique(test_list, key=lambda x: x.first_attribute + x.second_attribute)