【问题标题】:List of objects with a unique attribute具有唯一属性的对象列表
【发布时间】:2013-06-25 05:19:26
【问题描述】:

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

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

object1.thing = 1
object2.thing = 2
object3.thing = 3
object4.thing = 2

我想以任何一个结束

[object1, object2, object3]

[object1, object3, object4]

最终列表中的确切对象并不重要,只是其特定属性的列表是唯一的。

编辑:澄清一下,基本上我想要的是一个与该特定属性无关的集合。

【问题讨论】:

标签: python


【解决方案1】:

您可以使用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)]

上面的代码等价于:

seen = set()
unique = []
for obj in objects:
    if obj.thing not in seen:
        unique.append(obj)
        seen.add(obj.thing)

【讨论】:

  • 赞成,因为集合比 dicts 更能传达任务。两者都使用 Python 的“可散列”对象的概念,因此在功能上是等效的。但是,如果我正在阅读您的代码,sets 会立即告诉我“他想要一个唯一的事物列表”,而 dict 会告诉我“他需要映射数据”,在这种情况下这是一种误导。
  • 这是一个更好的解决方案,但代码在 Python 2 和 3 中都会导致语法错误。 unique = [obj for obj in objects if obj.thing not in seen and not seen.add( obj.thing)] 是正确的语法
【解决方案2】:

您可以创建一个字典,其键是对象的东西,值是对象本身。

d = {}
for obj in object_list:
    d[obj.thing] = obj
desired_list = d.values()

【讨论】:

  • 短:dict((obj.thing, obj) for obj in object_list).values().
  • 我绝对喜欢这样,但我总是很难阅读 dict 理解,我想弄清楚我在做什么。
  • Python 3 使它更漂亮:{obj.thing: obj for obj in object_list}(但从values 返回一个视图,而不是列表)。
  • 投反对票。这是一种常见的做法,但是,我认为以这种方式使用 dicts 是不好的做法。这是构建集合的确切用例类型,应该使用它们。
  • 使用字典理解:{ obj.thing : obj for obj in object_list}.values()。我发现这比上面投票最多的评论更具可读性。
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多