|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
22.07.2019, 13:28 | #1 |
Новичок
Джуниор
Регистрация: 22.07.2019
Сообщений: 3
|
Почему при переборе не удаляется эта буква 'c'???
Хочу из списка а удалить все буквы, кроме буквы а. Почему у меня постоянно остается эта ненавистная буква с?
|
22.07.2019, 13:47 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
а поменяй местами 'c' и 'd' ненавистной станет 'd', наверно. С питоном дела не имею, но полагаю, что после удаления 'b' следующим символом в цикле стал 'd', а 'c' занял место удаленного и не проверяется. Это так - домыслы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
22.07.2019, 14:13 | #3 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,716
|
Код:
Код:
|
22.07.2019, 15:31 | #4 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,312
|
У тебя изменяется список в цикле.
Пусть список такой: ['a', 'b', 'c', 'd', 'e', 'f'] При первом вхождении генерируются индексы для вытаскивания из списка значений: от 0 до 5. На первом шаге индекс равен 0 и извлекается 'a', которая не удаляется. Состояние списка: ['a', 'b', 'c', 'd', 'e', 'f'] На втором шаге индекс равен 1 и извлекается 'b', которая удаляется и список становится короче. Состояние списка: ['a', 'c', 'd', 'e', 'f'] На третьем шаге индекс равен 2 и извлекается 'd', которая удаляется. Состояние списка: ['a', 'c', 'e', 'f'] На четвертом шаге индекс равен 3 и извлекается 'f', которая удаляется. Состояние списка: ['a', 'c', 'e'] На следующем шаге индекс вываливается за границу списка и итерация прекращается. Почему при этом не выдаётся ошибка? Не знаю. Думаю, что так задумано, но возможно это системная ошибка Puthon. Проверь на этом примере: Код:
Как-то так, ...
|
22.07.2019, 15:36 | #5 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,716
|
|
22.07.2019, 15:53 | #6 | |
Новичок
Джуниор
Регистрация: 22.07.2019
Сообщений: 3
|
Цитата:
|
|
22.07.2019, 15:54 | #7 |
Новичок
Джуниор
Регистрация: 22.07.2019
Сообщений: 3
|
Всем большое спасибо за оперативность. Огонь
|
22.07.2019, 16:54 | #8 | |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,312
|
Цитата:
В цикле идёт обработка списка, размер которого сокращается. Набор ссылок на элементы списка генерировался на первом шаге. Выходит, что последнее обращение вывалилось за размер текущего списка. Вроде того, что индекс вне границ. Если бы список обрабатывался при каждой итерации, то такого поведения мы не наблюдали бы. Но это моё представление о данном процессе обработки и возможно, что в нём кроется ошибка. Но пока у меня другого объяснения нет.
Как-то так, ...
|
|
22.07.2019, 17:08 | #9 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,716
|
|
22.07.2019, 19:48 | #10 | |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,312
|
Цитата:
Элемент цикла in - формирует, в моём понимании, множество значений, которые используются, в последующем, для просмотра, в этом примере, элементов списка. Я это понимание и описал ранее. Т.е., перед вхождением в цикл генерируется некоторое множество индексов (0, 1, 2, 3, и т.д.). Затем элементы этого множества используются для обращения к элементам списка, типа a[0], a[1], ... Так как множество индексов генерируется один раз, перед началом цикла, то при редактировании самого списка (сдвиг элементов влево при удалении), приводит к тому, что не все индексы сформированного множества участвуют в просмотре списка. Оставшиеся значения выходят за текущий размер списка. Если бы множество индексов (для просмотра элементов списка) генерировалось при каждой итерации, то после изменения размера списка он [список] просматривался с начала, и тогда ситуации с пропуском элементов не возникало. Вместе с тем, подумалось, а если список завершается признаком конца списка (в Паскале - Nill)? В этом случае вопрос снимается, т.к. обнаружение конца списка естественным образом завершает цикл выбора элементов. PS: Я не питонист и вообще то и не программист. Так, любитель самоучка. Так что это только мои предположения и не более того. Питоном увлёкся относительно недавно, с целью применения в процессах обучения ...
Как-то так, ...
Последний раз редактировалось ViktorR; 22.07.2019 в 19:51. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Почему не передвигается буква? | Makzlol | Python | 6 | 28.04.2019 14:22 |
Подскажите пожалуйста почему добавляется всего одна буква из трех? | Nata Golden rose | Общие вопросы C/C++ | 2 | 22.05.2014 05:29 |
не удаляется запись - почему? | cliv | БД в Delphi | 2 | 25.07.2011 23:21 |
С++. Почему удаляется последний эелемент? | AxenicX | Помощь студентам | 5 | 30.11.2009 00:41 |
Проблема при переборе списка | Spice | Общие вопросы C/C++ | 3 | 22.07.2009 08:22 |