在python中运行循环限制迭代

2024-05-16 09:44:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的对象列表,我需要找到所有具有相同属性(任何_object.any_属性)然后把它们添加到一个新列表中。所以我已经对它们进行了预排序并运行了一个二进制搜索算法。 我已经找到了具有匹配属性的对象,但问题是有不止一个这样的对象(它们是相邻的),但我无法找到一种干净的方法在这些连续的对象上运行循环,以便它们都可以被追加。我的代码粘贴在下面。在

  low   = 0
  high  = len(sortedObjects)
  while low < high:
    mid = (low + high)/2
    if sortedObjects[mid].attr < desired_attr:
      low = mid + 1
    elif sortedSamples[mid].attr > desired_attr:
      high = mid
    else:
      newList.append(sortedObjects[mid])
      break

所以我需要在最后一个else块中编写一些新代码,它将迭代具有相同属性的所有对象并将其附加。听起来像是需要一个for循环,但是有没有可能在有限的迭代中运行for循环,比如在C中?在

我不想迭代整个列表,因为那样会比较慢,而且这个脚本的一个要求是它必须快速高效。它将运行在非常大的数据集上,我们期待10-12小时的执行时间。提前谢谢!在


Tags: 对象代码列表for属性object排序any
3条回答

在else块中运行第二个循环,减少mid直到找到第一个对象,然后向前循环以获取所有对象。您可以通过保存旧的mid并在“向后循环”中找到的元素时保存它们,然后在前向循环之前再次向前跳转,这样可以稍微加快速度。在

试试这个:

else:
    # Find the first element that matches
    while mid > 0 and sortedSamples[mid - 1].attr == desired_attr:
        mid -= 1

    # Iterate until an element that doesn't match is found.
    while mid < len(sortedSamples) and sortedSamples[mid].attr == desired_attr:
        newList.append(sortedObjects[mid])
        mid += 1

它在O(m)时间内运行,其中m是具有所需属性的对象数。在

如果要更频繁地执行此搜索,请创建此属性的列表:

attr_list = [o.attr for o in sortedObjects]

然后使用bisect模块:

^{pr2}$

相关问题 更多 >