Python:如何按对象属性过滤掉列表中的重复项?

时间:2017-06-14 20:45:09

标签: python

说我有

class a:
    b = 1
thing = a()
thing2 = a()
thing3 = a()
thing3.b = 2
lst = [thing,thing2,thing3]

我想要这样的事情:

lst = filter_out(obj.b==obj2.b,lst)

结果(具有相同属性的对象被过滤,因此只剩下一个):

[thing2,thing3]

如何实现这一目标?据我所知,lambda过滤器不能用于比较列表中的两个对象。

2 个答案:

答案 0 :(得分:2)

使用字典按pd.DataFrame( *list(map(list, zip( *[(d, i) for i, l in zip(df.id, df.list_of_dicts) for d in l] ))) ).rename_axis('id').reset_index() id a b 0 100 1 2 1 100 11 22 2 200 3 4 3 200 33 44 属性映射对象。由于dict不能包含b两次,因此dict的值将是您的唯一元素。

b

根据您是要保留第一个还是最后一个唯一项目,要么覆盖现有值(如上面的代码所示),要么在添加项目之前添加>>> unique = {} >>> for x in lst: ... unique[x.b] = x ... >>> list(unique.values()) [<__main__.a object at 0xb724cfcc>, <__main__.a object at 0xb724cfec>] 检查。

答案 1 :(得分:0)

您也可以使用来自groupby模块的itertools,例如:

from itertools import groupby 

class A:
    b = 1

thing = A()
thing2 = A()
thing3 = A()
thing3.b = 2
lst = [thing, thing2, thing3]
# For testing purpose
dct_id = {id(thing): "thing", id(thing2): "thing2", id(thing3): "thing3"}
# groupping based on each object's b value
sub = [list(v)[-1] for _, v in groupby(lst, lambda x: x.b)]
# check the groupped objects by their id
for k in sub:
    print(dct_id[id(k)])

输出:

thing2
thing3

修改:感谢@ tobias_k的评论

如果我们有这样的对象:

thing = A()
thing2 = A()
thing3 = A()
thing2.b = 2
lst = [thing, thing2, thing3]

为了避免不良结果,我们需要sort lst其对象的b值。因此sub将成为:

sub = [list(v)[-1] for _, v in groupby(sorted(lst, key=lambda x: x.b), lambda x: x.b)]

重复相同的测试我们会:

thing3
thing2

Ps:最好在任何情况下对sub列表进行排序,以避免结果不佳。