Python 具有唯一属性的对象列表
我有一个对象列表,每个对象都有一个特定的属性。该属性不是唯一的,我希望最终得到一个对象列表,它是整个列表的子集,这样所有特定属性都是唯一的集合 例如,如果我有四个对象:Python 具有唯一属性的对象列表,python,Python,我有一个对象列表,每个对象都有一个特定的属性。该属性不是唯一的,我希望最终得到一个对象列表,它是整个列表的子集,这样所有特定属性都是唯一的集合 例如,如果我有四个对象: object1.thing = 1 object2.thing = 2 object3.thing = 3 object4.thing = 2 我想以两者中的任何一个结束 [object1, object2, object3] 或 最终列表中的确切对象并不重要,只是其特定属性的列表是唯一的 编辑:为了澄清,本质上我想要的是一
object1.thing = 1
object2.thing = 2
object3.thing = 3
object4.thing = 2
我想以两者中的任何一个结束
[object1, object2, object3]
或
最终列表中的确切对象并不重要,只是其特定属性的列表是唯一的
编辑:为了澄清,本质上我想要的是一个特定属性的键集。您可以创建一个dict,其键是对象的东西,值是对象本身
d = {}
for obj in object_list:
d[obj.thing] = obj
desired_list = d.values()
您可以使用
列表理解
和设置
:
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)]
上述代码相当于:
seen = set()
unique = []
for obj in objects:
if obj.thing not in seen:
unique.append(obj)
seen.add(obj.thing)
更短:
dict((obj.thing,obj)表示对象列表中的obj)。values()
。我当然喜欢这一点,但我总是很难阅读dict的理解,我想弄清楚我在做什么。Python 3使它更漂亮:{obj.thing:obj表示对象列表中的obj}
(但从值返回一个视图,而不是列表).被否决。这是一种常见的做法,然而,我认为以这种方式使用dicts是不好的做法。这正是构建集合所针对的用例类型,应该使用它们。使用dict comprehension:{obj.thing:obj for obj in object_list}.values()
。我发现这比上面大多数投票人的评论更具可读性。因为集合比dict更好地传达任务。两者都使用Python的“hashable”对象概念,因此在功能上是等价的。但是,如果我正在阅读您的代码,sets会立即告诉我“他想要一个唯一的列表”,而dict会告诉我“他需要映射数据”,这在本例中是误导性的。这是一个更好的解决方案,但代码会导致Python2和Python3中的语法错误。unique=[obj for obj in objects if obj.thing not in seen and not seen.add(obj.thing)]是的正确语法类型,可能重复
seen = set()
unique = []
for obj in objects:
if obj.thing not in seen:
unique.append(obj)
seen.add(obj.thing)