gpt4 book ai didi

python - 在python中按属性删除对象列表中的重复项

转载 作者:行者123 更新时间:2023-11-30 22:36:23 24 4
gpt4 key购买 nike

我有一个函数,我想一次浏览一个自定义对象列表(具有给定的中点),并获取具有唯一中点的对象并将它们放入一个新列表中。以下代码给我一个错误,即列表没有名为“midPoint”的属性,但我不确定如何获取代码来搜索列表中具有匹配中点的对象。有人有推荐吗?

class Obj():
def __init__(self, midPoint=[0,0]):
self.midPoint = midPoint

obj1 = Obj(midPoint = [1,1])
obj2 = Obj(midPoint = [2,2])
obj3 = Obj(midPoint = [3,3])
obj4 = Obj(midPoint = [1,1])
obj5 = Obj(midPoint = [2,2])

l = [obj1, obj2, obj3, obj4, obj5]

list_no_duplicates = []

def Delete_duplicates(list1):
for i in list1:
if i.midPoint not in list_no_duplicates.midPoint:
list_no_duplicates.append(x)

Delete_duplicates(l)
print list_no_duplicates

最佳答案

您可以使用itertools.groupby以及sorted功能从列表中删除重复的条目。例如:

>>> from itertools import groupby

>>> [next(obj) for i, obj in groupby(sorted(l, key=lambda x: x.midPoint), lambda x: x.midPoint)]
[Obj: midPoint [1, 1], Obj: midPoint [2, 2], Obj: midPoint [3, 3]]

在这里,我添加了 __repr__()函数到您的 Obj 类,以使用您的类对象显示 midPoint 的值:

def __repr__(self):
return 'Obj: midPoint {}'.format(str(self.midPoint))

注意:此解决方案不会维持原始列表中元素的顺序。新列表将根据 midPoint 的值进行排序。

<小时/>

以下是完整代码供您引用:

from itertools import groupby

class Obj():
def __init__(self, midPoint=[0,0]):
self.midPoint = midPoint
def __repr__(self):
return 'Obj: midPoint {}'.format(str(self.midPoint))

obj1 = Obj(midPoint = [1,1])
obj2 = Obj(midPoint = [2,2])
obj3 = Obj(midPoint = [3,3])
obj4 = Obj(midPoint = [1,1])
obj5 = Obj(midPoint = [2,2])

l = [obj1, obj2, obj3, obj4, obj5]
# `print(l)` will display:
# [Obj: midPoint [1, 1], Obj: midPoint [2, 2], Obj: midPoint [3, 3], Obj: midPoint [1, 1], Obj: midPoint [2, 2]]

# New list with unique `midPoint`s
new_list = [next(obj) for i, obj in groupby(sorted(l, key=lambda x: x.midPoint), lambda x: x.midPoint)]
# `print(new_list)` will display:
# [Obj: midPoint [1, 1], Obj: midPoint [2, 2], Obj: midPoint [3, 3]]

关于python - 在python中按属性删除对象列表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44190924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com