【问题标题】:Most efficient way to find objetcs in list of objects [duplicate]在对象列表中查找对象的最有效方法[重复]
【发布时间】:2014-12-04 09:09:36
【问题描述】:

我有一个对象列表或数组(python 中的正确术语是什么?)。 获取所有符合条件的对象的最有效方法是什么?

我可以遍历列表并检查每个元素,但这似乎效率不高。

objects = []
for object in list:
  if object.value == "123":
    objects.add(object)

【问题讨论】:

  • “高效”是一个模糊的术语。你的意思是“最快的方式”还是“最简单的方式”?
  • 我的意思是最快的方式
  • 然后提供更多详细信息(见下文)。

标签: python arrays list


【解决方案1】:

这是最简单的方法:

objects = [x for x in someList if x.value == 123]

如果您正在寻找更快的解决方案,您必须告诉我们更多关于您的对象以及源列表是如何构建的信息。例如,如果所讨论的属性在对象中是唯一的,则使用dict 而不是list 可以获得更好的性能。另一种选择是保持列表排序并使用bisect 而不是线性搜索。但是请注意,当列表变得非常大时,这些优化工作开始变得有意义,如果您的元素少于约 500 个,只需使用推导式即可。

【讨论】:

  • Pythonic,Python 2 / Python 3 兼容,高效,无 lambdas。 +1
  • 这比filter()更简单、更Pythonic、更快。
【解决方案2】:

你可以使用filter

objects = filter(lambda i: i.value == '123', l)

自我注意
显然,"filter vs list comp" 的辩论引发了激烈的战争。

【讨论】:

  • 这个“最有效的方式”怎么样?
  • 它是单行的,Pythonic 和O(N),如果您知道更有效的方法,请随时发布您自己的答案 ;)
  • 使用 Python 最有效的方法是在列表中搜索本地扩展模块,但对于 99.9999999 % 的可能用例来说,这不是一个严肃的选择。对于这些 99.99 % 的过滤器是绝对正确的做法。 +1
  • 它比@georg 的答案中的列表理解慢 2 倍。