Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有唯一属性的对象列表_Python - Fatal编程技术网

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)