QgsVectorLayer::getFeatures で取得できるものは、配列ではなく QgsFeatureIterator クラスのオブジェクトです。
名前のとおりイテレータ(繰返し処理用のクラス)でして、「現在の位置の情報(インデックス)を含んだ配列」のようなものです。
for feature in features では、「現在位置から見て次の地物」を繰返し取得する処理になっていますので、
for j in range(layer.featureCount()) と異なり、前の処理の続きからの繰返しとなります。
(例)
features = iface.activeLayer().getFeatures()
print u"1回目"
for feature in features:
break
print u"2回目"
2回目では 4 から。3回目では(末端まで到達しているので)何も出力されません。
> for feature in features: を使う場合はどう書いたら良いか
内側のループが始まる前に、 features のインデックスを 0 に戻す必要がありますので、
# QgsFeatureIterator を生成しなおす
layer=iface.activeLayer()
for i in range(layer.featureCount()):
features = layer.getFeatures()
上記を試してみてください。
ただし、そもそもとして地物の削除等で、必ずしも id が0から連番となっている保証はないため、意図した処理とならない
場合があると思います。そうすると、成功例のように i と j でインデックスで比較するか、あるいは、一旦、地物 ID の配列を
作成し、それを外側のループで用い、 id で比較するか。どちらかにしたほうがいいと思います。