あなたが何をしたいのかを正しく理解していれば:
a_list = [1,2,3,5]
b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5'],
['d',4,'h'],['Z',5,'X'],['m',6,'i']]
print 'a_list ==',a_list
print '\nb_list before :\n',b_list
print '\nEnumerating b_list in reversed order :'
L = len(b_list)
print (' i el L-i b_list[L-i] \n'
' -------------------------------------')
for i,el in enumerate(b_list[::-1],1):
print ' %d %r %d %r' % (i,el,L-i,b_list[L-i])
L = len(b_list)
for i,el in enumerate(b_list[::-1],1):
if el[1] in a_list:
del b_list[L-i]
print '\nb_list after :\n',b_list
結果
a_list == [1, 2, 3, 5]
b_list before :
[['a', 1, 'b'], ['c', 2, 'g'], ['e', 3, '5'],
['d', 4, 'h'], ['Z', 5, 'X'], ['m', 6, 'i']]
Enumerating b_list in reversed order :
i el L-i b_list[L-i]
-------------------------------------
1 ['m', 6, 'i'] 5 ['m', 6, 'i']
2 ['Z', 5, 'X'] 4 ['Z', 5, 'X']
3 ['d', 4, 'h'] 3 ['d', 4, 'h']
4 ['e', 3, '5'] 2 ['e', 3, '5']
5 ['c', 2, 'g'] 1 ['c', 2, 'g']
6 ['a', 1, 'b'] 0 ['a', 1, 'b']
b_list after :
[['d', 4, 'h'], ['m', 6, 'i']]
逆の順序で b_list を反復する必要がある理由は、 abarnertによって言われ、ドキュメントによって以下に説明されているものです:
注: シーケンスがループによって変更されている場合、微妙な点があります (これは変更可能なシーケンス、つまりリストの場合にのみ発生します)。内部カウンターは、次に使用されるアイテムを追跡するために使用され、反復ごとにインクリメントされます。このカウンターがシーケンスの長さに達すると、ループは終了します。これは、スイートが現在の (または前の) アイテムをシーケンスから削除する場合、次のアイテムはスキップされることを意味します (既に処理された現在のアイテムのインデックスを取得するため)。同様に、スイートがシーケンス内の現在のアイテムの前にアイテムを挿入すると、現在のアイテムは次回のループで再び処理されます。これは、シーケンス全体のスライスを使用して一時的なコピーを作成することで回避できる厄介なバグにつながる可能性があります。
for x in a[:]:
if x < 0: a.remove(x)
http://docs.python.org/2/reference/compound_stmts.html#the-for-statement