我有一本字典,其中包含对象列表,如:
{"A": [obj1, obj2, obj3], "B": [obj1, obj4, obj5]}
在这里,我想获取一个唯一对象的列表,例如
[obj1, obj2, obj3, obj4, obj5]
这些对象不具有单个唯一属性(例如,唯一ID)。
我尝试使用set(),但是由于对象不可哈希,所以我没有成功。
如何完成此任务?
答案 0 :(得分:1)
假设您的字典为m
,则可以像这样使用set
:
s = set()
m = {'a': [1,2,3], 'b': [2,3,4,5,6]}
for v in m.values():
t_set = set(v)
s.update(t_set)
s
{1, 2, 3, 4, 5, 6}
我看到您说您的对象不可哈希。如果它们是您创建的对象,则可以覆盖__hash__()
函数,并定义自己的方法使它们可散列。
答案 1 :(得分:0)
以下作品。
def get_unique_objs(data):
ret = []
for obj_list in data.values():
for obj in obj_list:
if obj not in ret:
ret.append(obj)
return ret
这将返回一个列表,其中根据对象的__eq__ magic methods(如果有)没有两个对象相等,和/或与is
运算符(由Python解释器实现,始终可用,cannot be overriden)。
在某些情况下,可能还会发挥更多作用。 This shows the complete process检查是否应将对象添加到结果列表中。
答案 2 :(得分:0)
您可以使用itertools.chain
对所有值进行迭代。然后是一个简单的技巧,使用dict.fromkeys
而不是用于保留顺序同时仅保留唯一值的集合。 (请记住,这些对象必须是可索引的/可哈希的),您将需要弄清楚这些对象之间的可比性,才能完全完成此任务。
from itertools import chain
data = {"A": [obj1, obj2, obj3], "B": [obj1, obj4, obj5]}
output = list(dict.fromkeys(chain(*data.values())))
[obj1, obj2, obj3, obj4, obj5]