从字典中获取没有唯一属性的唯一对象列表

时间:2020-10-20 20:26:20

标签: python python-3.x

我有一本字典,其中包含对象列表,如:

{"A": [obj1, obj2, obj3], "B": [obj1, obj4, obj5]}

在这里,我想获取一个唯一对象的列表,例如

[obj1, obj2, obj3, obj4, obj5]

这些对象具有单个唯一属性(例如,唯一ID)。

我尝试使用set(),但是由于对象不可哈希,所以我没有成功。

如何完成此任务?

3 个答案:

答案 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]
相关问题