说我有
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过滤器不能用于比较列表中的两个对象。
答案 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
列表进行排序,以避免结果不佳。