![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
Paranorma |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 1.1.2007 Репутация: 1 Всего: 1 |
Необходимо удалить из списка дубликаты. Насколько я понимаю алгоритм такой, что тут элементы должны сравниваться друг с другом и один из двух одинаковых удаляться, то есть это как мне кажется такую программку можно написать с использованием цикла while
a = [45, 1, 34, 12, 78, 45, 12, 1, 34] вот мой список (он изначально заполнен целыми числами) Что дальше? |
|||
|
||||
kot_matros |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 11.1.2007 Репутация: нет Всего: нет |
|
|||
|
||||
Paranorma |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 1.1.2007 Репутация: 1 Всего: 1 |
Люди!!! Спасайте!!!
Препод убивец опять недоволен. У меня с циклом while проблемы и я вынуждена сейчас все задачи решать с его использованием. Вчера я написала так:
Дальше застопорилась... Получила от препода электронное письмо: Я совсем забыл сказать что set пользовать нельзя, в этом случае задача становиться тривиальной. Теперь обратимся ко второму фрагменту. Если посмотреть на второй фрагмент, то строчку if s надо убрать и вместо ее надо вставить фрагмент который сравнивает a[i] (или s) с элементами списка идущими после него и если какой то из последующих элементов равен a[i] то его надо удалить. Для организации такого сравнения надо использовать второй цикл вложенный в первый. В качестве переменной второго цикла можно взять j. Особое внимание надо уделить тому в каких пределах меняется перменная j. То есть один while вложен в другой.
Вот такой фрагмент я написала. Не знаю насколько он верный и как организовать сравнение элементов. Что написать после del? И верно ли это while j < len(a): (написала так, ориентируясь на слова препода "Особое внимание надо уделить тому в каких пределах меняется перменная j.") То есть ведь идет сравнение элементов в СПИСКЕ. Дальше-то что??? |
||||
|
|||||
doomik |
|
|||
![]() Одинокий волк ![]() ![]() Профиль Группа: Участник Сообщений: 360 Регистрация: 25.10.2005 Где: #vingrad Репутация: 3 Всего: 15 |
-------------------- "Единственный способ изучать новый язык программирования - писать на нем программы." - Brian Kernighan Remember, st1ng3r /server irc.ircline.ru /j #vingrad |
|||
|
||||
Paranorma |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 1.1.2007 Репутация: 1 Всего: 1 |
Я эту программу немного изменила
Она работает, но вот странно. У меня тут в списке трижды встречается число 45 и в калькуляторе и результат вот каким получается.
Почему-то 45 все равно дважды встречается в списке. А вот что преподаватель написал в своем письме: Другой вопрос разобрались ли вы во всех деталях как это все работает ? Если разобрались то разбиритесь почему не работает вот с таким списком a = [1, 1, 1] Выполните программу в пошаговом режиме печатая содержимое списка после каждого шага. Перед каждым шагом попытатесь угадать что получится и сравните с тем что получилось. Особое внимание обратите на момент когда из списка удаляется элемент. После того как разберетесь исправьте ошибку. Я попробовала свой список заменить на a = [1, 1, 1] и печатается почему то 2 единицы вместо одной, т.е. удаляется один дубликат вместо двух. Я попробовала все это выполнить в пошаговом режиме, но своей ошибки так и не увидела. Что делать? Точнее в чем же здесь ошибка? |
||||||||
|
|||||||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 6 Всего: 173 |
При удалении одного элемента все находящиеся за ним элементы списка сдвигаются. В результате счётчик «проскакивает» мимо следующего элемента. Самое правильное решение: не изменять исходный список, а формировать на его основе новый. Потенциальных возможностей для ошибок куда меньше. (Поборникам производительности: взгляните на реализацию list и прикиньте, что происходит при выполнении del a[i]. А теперь сравните с затратами на создание нового списка.) Если всё-таки сильно хочется остаться с текущим вариантом, то после удаления элемента не надо увеличивать счётчики. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
doomik |
|
|||
![]() Одинокий волк ![]() ![]() Профиль Группа: Участник Сообщений: 360 Регистрация: 25.10.2005 Где: #vingrad Репутация: 3 Всего: 15 |
Тогда можно так:
Если есть 2 одинаковых елемента то второй преврощается в 'a' а дальше идёт проверка если есть в списке 'a' то удалить его. Правда это будет работать если список состоит только из цифр, если список состоит из цифр и букв то наверное всётаки можно найти какой-небудь другое исключения. Это сообщение отредактировал(а) doomik - 20.1.2007, 00:31 -------------------- "Единственный способ изучать новый язык программирования - писать на нем программы." - Brian Kernighan Remember, st1ng3r /server irc.ircline.ru /j #vingrad |
|||
|
||||
V.A.KeRneL |
|
||||
![]() Vadim A. Kazantsev ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 3.12.2006 Где: Moscow, Russia Репутация: 7 Всего: 14 |
Вот моя «безопасная» (с созданием нового объекта-списка) функция:
Пример использования функции:
Это сообщение отредактировал(а) V.A.KeRneL - 24.1.2007, 18:52 -------------------- «C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы» ---/)/)---(\.../)---(\(\ --(':'=)---(=';'=)---(=':') (")(")..)-(").--.(")-(..(")(") |
||||
|
|||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 6 Всего: 173 |
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
V.A.KeRneL |
|
|||
![]() Vadim A. Kazantsev ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 3.12.2006 Где: Moscow, Russia Репутация: 7 Всего: 14 |
Вернее if (not a[i] in b): ![]() Интерактивную хелпу к Питону я уже научиля читать:
Но мне, тем не менее, больше нравится мой вариант с методом __contains__(...). Это сообщение отредактировал(а) V.A.KeRneL - 24.1.2007, 19:44 -------------------- «C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы» ---/)/)---(\.../)---(\(\ --(':'=)---(=';'=)---(=':') (")(")..)-(").--.(")-(..(")(") |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 6 Всего: 173 |
Зачем? Ну зачем усложнять жизнь себе и читающему код? По степени целесообразности для меня это эквивалентно (2).__add__(2) вместо 2 + 2 или a.__getitem__(i) вместо a[i]. В каждом языке есть определённые best practices. Им не стоит следовать догматично, но и ломать их только потому, что так хочется, не стоит. TIMTOWTDI must die ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
V.A.KeRneL |
|
|||
![]() Vadim A. Kazantsev ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 3.12.2006 Где: Moscow, Russia Репутация: 7 Всего: 14 |
Void, я пришёл из Ruby... Вернее, я из него и не выходил!..
![]() Ну тогда просто скажу, что я привык (на подсознательном уровне) использовать ключевое слово in в циклах, а не в условиях. В Паскале in используется в условиях (для проверки принадлежности элемента множеству (set)), но только в них! А в скриптовых языках Ruby и Python это зарезервированное слово используется для организации цикла for. И моё имхо, должно использоваться только для них, т.к. меня лично коробит использование одного и того же ключевого слова для организации совершенно разных конструкций. А плюс и квадратные скобочки, к счастью, ни с чем не конфликтуют, так что их я использовал, использую и буду использовать без малейшего дискофорта! ![]() В принципе, об этом я и написал выше, только более подробно. «Краткость — сестра таланта» © А.П. Чехов. ![]() З.Ы. Но что-то мы заоффтопили... Пора бы Paranorma'е пометить вопрос решённым! Это сообщение отредактировал(а) V.A.KeRneL - 24.1.2007, 21:05 -------------------- «C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы» ---/)/)---(\.../)---(\(\ --(':'=)---(=';'=)---(=':') (")(")..)-(").--.(")-(..(")(") |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 6 Всего: 173 |
V.A.KeRneL, говорит, говорит.
Но всё-таки, фразу про устав и монастырь стоит иметь в виду ![]() По мне неоднозначности тут нет. Да что я, это даже на сложность формальной грамматики не влияет ![]() Есть немного. Если видно какое-то продолжение темы, то можно попросить модераторов отделить. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
pythonwin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: нет Всего: 36 |
программист == человек, и поэтому мыслит ассоциациями ![]()
я за использование in а условиях - в ФП бывает нужно сильно сократить код + увеличивается скорость выполнения
это ФП в python - говорят пришло из Lisp, но это лучше к Artemios или albertn. позволяет сильно сократить код Это сообщение отредактировал(а) pythonwin - 25.1.2007, 07:54 |
||||
|
|||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 2 Всего: 50 |
лучше к Void ![]() in как in... Это ж не арифметический цикл. while <condition1>: <actions> for <condition2>: <actions> , где на condition2 наложено ограничение condition2= leftExpr in rightExpr, а for производит перебор элементов из rightExpr и их унификацию с leftExpr... Не знаю, может лучше было бы forall назвать, хотя здесь без разницы... -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |