在python中运行循环限制迭代

在python中运行循环限制迭代,python,for-loop,Python,For Loop,我有一个非常大的对象列表,我需要找到所有具有相同属性的对象(any_object.any_attribute),然后将它们附加到一个新列表中。所以我对它们进行了预排序,并运行了一个二进制搜索算法。 我找到了具有匹配属性的对象,但问题是有多个这样的对象(它们是邻居),但我无法找到一种干净的方法在这些连续对象上运行循环,以便它们都可以被追加。我的代码粘贴在下面 low = 0 high = len(sortedObjects) while low < high: mi

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

  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
low=0
高=长度(分拣对象)
低<高:
中=(低+高)/2
如果sortedObjects[mid].attr所需属性:
高=中
其他:
追加(sortedObjects[mid])
打破
因此,我需要在最后一个else块中编写一些新代码,它将迭代具有相同属性的所有对象并附加它们。听起来可能需要for循环,但是否可以像在C中那样在有限的迭代中运行for循环

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

试试这个:

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
其他:
#查找匹配的第一个元素
当mid>0且sortedSamples[mid-1].attr==所需的\u attr:
中-=1
#迭代直到找到不匹配的元素。
而mid

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

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

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

attr_list = [o.attr for o in sortedObjects]
然后使用模块:

import bisect
left_i = bisect.bisect_left(attr_list, desired_attr)
right_i = bisect.bisect_right(attr_list, desired_attr, left_i)
newList = sortedObjects[left_i:right_i]