具有唯一属性的对象列表

Mic*_*vis 14 python

我有一个对象列表,每个对象都有一个特定的属性.该属性不是唯一的,我想最终得到一个对象列表,这些对象是整个列表的一个子集,这样所有特定属性都是唯一的集合.

例如,如果我有四个对象:

object1.thing = 1
object2.thing = 2
object3.thing = 3
object4.thing = 2
Run Code Online (Sandbox Code Playgroud)

我想最终得到两者

[object1, object2, object3]
Run Code Online (Sandbox Code Playgroud)

要么

[object1, object3, object4]
Run Code Online (Sandbox Code Playgroud)

在最终列表中出现的确切对象并不重要,只有它们的特定属性列表是唯一的.

编辑:为了澄清,基本上我想要的是一个键入该特定属性的集合.

Ash*_*ary 20

你可以使用list comprehensionset:

objects = (object1,object2,object3,object4)
seen = set()
unique = [obj for obj in objects if obj.thing not in seen and not seen.add(obj.thing)]
Run Code Online (Sandbox Code Playgroud)

上面的代码相当于:

seen = set()
unique = []
for obj in objects:
    if obj.thing not in seen:
        unique.append(obj)
        seen.add(obj.thing)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的解决方案,但是代码在Python 2和3中都会导致语法错误.adutual = [obj for object中的obj如果obj.thing没有看到而且没有看到.add(obj.thing)]是正确的句法 (5认同)
  • Upvoted因为集合比dicts更好地传达任务.两者都使用Python的"可散列"对象的概念,因此在功能上是等价的.但是,如果我正在阅读你的代码,那些套装会告诉我"他想要一个独特的事物列表",而dict告诉我"他需要映射数据",这在这种情况下是误导性的. (2认同)

Bri*_*ien 13

你可以创建一个dict,其关键是对象的东西,值是对象本身.

d = {}
for obj in object_list:
    d[obj.thing] = obj
desired_list = d.values()
Run Code Online (Sandbox Code Playgroud)

  • 更短:`dict((obj.thing,obj)for object_list中的obj).values()`. (10认同)
  • Python 3使它更漂亮:`{obj.thing:obj for object_list}中的obj(但是从`values`返回一个视图,而不是一个列表). (2认同)
  • 使用字典理解:`{ obj.thing : obj for obj in object_list}.values()`。我发现这比上面的大多数投票评论更具可读性。 (2认同)