Найти - Пользователи
Полная версия: Как работает итератор (на двух примерах)?
Начало » Python для новичков » Как работает итератор (на двух примерах)?
1
lkk
Всем привет!

Недавно начал изучать питон и сегодня выполняя задание по курсу на неком интернет-ресурсе столкнулся с любопытной вещью.
Задание: дан список элементов, найти в нём все что начинаются на “c”, удалить их и вывести что осталось.
Первоначально я сделал так:
 list = ['cinty','olsen','barry','cantella','cori','supreme']
for item in list:
	if item.startswith('c'): list.remove(item)
print(list)
Очевидно, что в этом коде заложен косяк - remove сместит элементы на один влево и тот элемент который должен был быть следующим займёт позицию удалённого, цикл перескочит через один элемент и задача будет невыполнена.

В итоге такой код делал всё как надо:
 list = ['cinty','olsen','barry','cantella','cori','supreme']
for item in list[::1]:
	if item.startswith('c'): list.remove(item)
print(list)

Выходит, что цикл
 for item in list:
итерирует по индексам списка, а
 for item in list[::1]:
по его элементам. Вернее я так предполагаю.

Вопрос у меня такой: может кто-то объяснить почему оно так или ткнёт ссылкой в ман/статью (можно англоязычную) где описана подоплёка такого поведения?
FishHook
lkk
Выходит, что цикл
lkk
итерирует по индексам списка, а
Именно! Дело в том, что никак иначе оно итерироваться просто не может. Список - это тот же массив, но с автоматическим выделением памяти и копированием элементов. Один черт в памяти должна быть выделена область, в которую последовательно записываются указатели на объекты-члены коллекции. Никакой магии.
Vintets
lkk
Выходит, что цикл

for item in list:

итерирует по индексам списка, а

for item in list:

по его элементам. Вернее я так предполагаю.

Ты просто сделал копию списка
list[::1]
Срезами от начала до конца. Получил новый список и по нему уже пробегал циклом. А элементы удалял в первом списке.
Можно было написать просто
 list[:]
вместо
 list[::1]

Обычно если действие простое, то проще сделать так
 lst = ['cinty','olsen','barry','cantella','cori','supreme']
lst = [i for i in lst if not i.startswith('c')]
print(lst)

Или в твоём случае так
 lst = ['cinty','olsen','barry','cantella','cori','supreme']
lst = list(filter(lambda x: x.startswith('c'), lst))
print(lst)
lkk
Теперь понял. Спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB