Лучшее решение, вероятно, - сначала отфильтровать missileList
с использованием списка.
self.missileList = [m for m in self.missileList if m[i] >= m[4]]
Тогда сделай
for i, m in enumerate(self.missileList): # enumerate instead of range
# process missile
Как хорошо задокументировано , удаление элементов из списков во время их перебора не работает, даже (особенно) с диапазоном, поскольку у вас больше индексов, чем элементов списка. Если вам нужно изменить список на месте, см. здесь .
Понимание списков действительно довольно простое, и я настоятельно рекомендую поиграть с ними еще немного. Вот быстрый учебник. Постижения списков просто превращают один список в другой, применяя функцию или выражение к каждому элементу по очереди:
[1, 2, 3, 4, 5, 6] -> [1, 4, 9, 16, 25, 36]
Они также могут фильтровать списки:
[1, 2, 3, 4, 5, 6] -> [4, 5, 6]
Они работают так, с каждым из ключевых синтаксических компонентов в << >>:
[ <<thing_to_do_for_each_item(item)>> <<for item in ['list', 'of', 'items']>> ]
При желании вы можете добавить предикат в конце фильтра
[ <<thing(item)>> <<for item in ['l', 'o', 'i']>> <<if boolean_test(item)>> ]
Где boolean_test
- любой вид выражения или функции, который может интерпретироваться как приводящий к логическому значению.
Вы можете видеть, что, хотя они перемещают биты, они действительно очень похожи, если говорить синтаксически, для операторов:
newlist = []
<<for item in ['l', 'o', 'i']>>:
<<if boolean_test(item)>>:
newlist.append( <<thing(item)>> )
Обратите внимание, что порядок ключевых слов точно такой же - for
, затем if
. Единственное отличие состоит в том, что thing(item)
идет сначала вместо последний . (Но учтите, что он все еще выполняется только , если <<bolean_test(item)>>
возвращает true.) Это правило довольно просто обобщает более сложные списки (но я не буду вдаваться в подробности).
Все это означает следующий код:
old_list = [1, 2, 3, 4, 5, 6]
new_list = []
for i in old_list:
if i > 3:
new_list.append(i ** 2)
Эквивалентно этому:
new_list = [i ** 2 for i in old_list if i > 3]
В обоих случаях результатом является отфильтрованный список квадратов элементов в исходном списке:
>>> print old_list, new_list
[1, 2, 3, 4, 5, 6] [16, 25, 36]
Пожалуйста, дайте мне знать, если вам нужны дальнейшие объяснения. Я думаю, что понимание списка - действительно полезная и важная часть языка. Вы должны изучить их как можно скорее.