猿问

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

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

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

在这里,我想获得一个独特对象的列表,例如

[obj1, obj2, obj3, obj4, obj5]

这些对象没有单一的唯一属性(例如唯一的 id)。

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

我怎样才能完成这个任务?


翻阅古今
浏览 122回答 3
3回答

qq_遁去的一_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__()函数并定义您自己的方式以使它们可散列。

有只小跳蛙

您可以使用itertools.chain它对所有值创建迭代器。然后是一个简单的技巧,使用dict.fromkeys而不是集合来保留顺序,同时仅保留唯一值。(请记住,对象必须是可索引/可散列的)您将需要弄清楚这些对象如何进行比较才能完成此任务。from itertools import chaindata = {"A": [obj1, obj2, obj3], "B": [obj1, obj4, obj5]}output = list(dict.fromkeys(chain(*data.values())))[obj1, obj2, obj3, obj4, obj5]

汪汪一只猫

以下作品。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__ 魔术方法(如果可用)和/或与运算符的比较is(由 Python 解释器实现,始终可用且无法覆盖),没有两个对象相等。在某些情况下,可能还会有更多的因素发挥作用。 这显示了检查是否应将对象添加到结果列表中的完整过程。
随时随地看视频慕课网APP

相关分类

Python
我要回答