Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2019, 13:28   #1
Ignatella
Новичок
Джуниор
 
Регистрация: 22.07.2019
Сообщений: 3
Злость Почему при переборе не удаляется эта буква 'c'???

Хочу из списка а удалить все буквы, кроме буквы а. Почему у меня постоянно остается эта ненавистная буква с?
Изображения
Тип файла: png img-2019-07-22-13-26-05.png (4.3 Кб, 41 просмотров)
Ignatella вне форума Ответить с цитированием
Старый 22.07.2019, 13:47   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

а поменяй местами 'c' и 'd' ненавистной станет 'd', наверно. С питоном дела не имею, но полагаю, что после удаления 'b' следующим символом в цикле стал 'd', а 'c' занял место удаленного и не проверяется. Это так - домыслы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.07.2019, 14:13   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
a = [ x for x in a if x == 'a' ]
Код:
a = list(filter(lambda x: x == 'a' , a))
p51x вне форума Ответить с цитированием
Старый 22.07.2019, 15:31   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

У тебя изменяется список в цикле.
Пусть список такой: ['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.
Проверь на этом примере:
Код:
a=['a', 'b', 'c', 'd','e','f']
for letter in a:
    print(a, '   ', letter)
    if letter != 'a':
        a.remove(letter)
Ответ был дан выше. Другие версии решения можно создать самому, понимая причину.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 22.07.2019, 15:36   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Почему при этом не выдаётся ошибка? Не знаю. Думаю, что так задумано, но возможно это системная ошибка Puthon.
А почему должна быть ошибка, PiktorR?
p51x вне форума Ответить с цитированием
Старый 22.07.2019, 15:53   #6
Ignatella
Новичок
Джуниор
 
Регистрация: 22.07.2019
Сообщений: 3
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
У тебя изменяется список в цикле.
Пусть список такой: ['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.
Проверь на этом примере:
Код:
a=['a', 'b', 'c', 'd','e','f']
for letter in a:
    print(a, '   ', letter)
    if letter != 'a':
        a.remove(letter)
Ответ был дан выше. Другие версии решения можно создать самому, понимая причину.
СПАСИБО ОГРОМНОЕ!!!
Ignatella вне форума Ответить с цитированием
Старый 22.07.2019, 15:54   #7
Ignatella
Новичок
Джуниор
 
Регистрация: 22.07.2019
Сообщений: 3
По умолчанию

Всем большое спасибо за оперативность. Огонь
Ignatella вне форума Ответить с цитированием
Старый 22.07.2019, 16:54   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
А почему должна быть ошибка, PiktorR?
так думаю, что это ко мне
В цикле идёт обработка списка, размер которого сокращается.
Набор ссылок на элементы списка генерировался на первом шаге.
Выходит, что последнее обращение вывалилось за размер текущего списка.
Вроде того, что индекс вне границ.
Если бы список обрабатывался при каждой итерации, то такого поведения мы не наблюдали бы.
Но это моё представление о данном процессе обработки и возможно, что в нём кроется ошибка.
Но пока у меня другого объяснения нет.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 22.07.2019, 17:08   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Выходит, что последнее обращение вывалилось за размер текущего списка.
Вроде того, что индекс вне границ.
Так не выходит же

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Если бы список обрабатывался при каждой итерации, то такого поведения мы не наблюдали бы.
А что делает for по вашему?
p51x вне форума Ответить с цитированием
Старый 22.07.2019, 19:48   #10
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
А что делает for по вашему?
Этот цикл не соответствует понятию for в Си или Паскале.
Элемент цикла in - формирует, в моём понимании, множество значений, которые используются, в последующем, для просмотра, в этом примере, элементов списка. Я это понимание и описал ранее.
Т.е., перед вхождением в цикл генерируется некоторое множество индексов (0, 1, 2, 3, и т.д.). Затем элементы этого множества используются для обращения к элементам списка, типа a[0], a[1], ...
Так как множество индексов генерируется один раз, перед началом цикла, то при редактировании самого списка (сдвиг элементов влево при удалении), приводит к тому, что не все индексы сформированного множества участвуют в просмотре списка. Оставшиеся значения выходят за текущий размер списка.

Если бы множество индексов (для просмотра элементов списка) генерировалось при каждой итерации, то после изменения размера списка он [список] просматривался с начала, и тогда ситуации с пропуском элементов не возникало.

Вместе с тем, подумалось, а если список завершается признаком конца списка (в Паскале - Nill)? В этом случае вопрос снимается, т.к. обнаружение конца списка естественным образом завершает цикл выбора элементов.

PS: Я не питонист и вообще то и не программист. Так, любитель самоучка. Так что это только мои предположения и не более того.
Питоном увлёкся относительно недавно, с целью применения в процессах обучения ...
Как-то так, ...

Последний раз редактировалось ViktorR; 22.07.2019 в 19:51.
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не передвигается буква? 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