Работает нормально, если вы удаляете элементы из списка при переборе его reversed()
версии.
d={'a': ['abc','def','ghi','abcd','ghij'], 'b': [6, 7, 8]}
for i in reversed(d['a']):
if i.startswith("a"):
d['a'].remove(i)
#print('1st print '+i)
if i.startswith("d"):
d['a'].remove(i)
#print('2nd print '+i)
print(d)
Вывод: {'a': ['ghi', 'ghij'], 'b': [6, 7, 8]}
Это происходит потому, что при удалении элементаи итерируйте от start списка, элементы, которые вы еще не проверили , могут изменить свою позицию в списке.Этого не происходит при итерации в обратном порядке, начиная с end .