Так как вы выполняете удаление, следующий элемент, по которому начинается итерация списка, равен 7, а не 'z'
в вашей 4-й итерации l oop, вы узнаете 'p' в быть строкой. Индекс «p» равен 3. Как только вы удалите, индекс «z» теперь равен 3, и, поскольку ваш l oop идет в следующий раз, он пропускает «z» и идет прямо к 7.
Попробуйте этот эксперимент, если вы замените 'z' на 'p', ваш l oop не удалит 'p'. Ваша логика c для проверки того, является ли элемент строкой или нет, не ошибочна, скажем, [в идеале вы должны использовать isinstance (элемент, тип)], но это ваша логика c удаления элемента, вызвавшего это.