Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 19.01.2016
Сообщений: 9

Несложная задачка про массив с удалением элеметов

18.09.2020, 18:28. Показов 594. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Помогите, пожалуйста, вроде задачка легкая, но никак не могу решить.
На входе дан массив, состоящий из чисел. Например a=[22,33,44,5,6,66,66,7,18,18,109,109].
Требуется преобразовать его по правилу, если [a][/i] равен [a][/i-1], т.е. текущий элемент равен предыдущему, удаляем предыдущий элемент. На выходе a=[22,33,44,5,6,66,7,18,109]. Нельзя использовать другие массивы. Спасибо!!

Первый вариант:
Python
1
2
3
4
a=[22,33,44,5,6,66,66,7,18,18,109,109]
for i in range(1,len(a)):
    if a[i]==a[i-1]:
        a.pop(i)
Понимаю, что индекс за пределами массива, но не понимаю почему.
Python
1
2
3
4
5
j=0
for i in range(1,len(a)-j):
    if a[i]==a[i-1]:
        a.pop(i)
        j=j+1
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.09.2020, 18:28
Ответы с готовыми решениями:

Несложная задачка
Составьте программу, позволяющую определить, есть ли в школе в 8-х классах однофамильцы. Данные об учениках должны идти в следующем...

Задачка несложная
http://5.firepic.org/5/images/2013-11/04/8hpfr4qkym6l.png

Несложная олимпиадная задачка
Привет, нужна помощь в решении олимпиадки, помогите пожалуйста Пологий подъем Группа геодезистов должна поднять геодезический знак...

6
 Аватар для Semen-Semenich
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,307
18.09.2020, 18:42
Цитата Сообщение от Николай_39 Посмотреть сообщение
Понимаю, что индекс за пределами массива, но не понимаю почему
элементарно Ватсон! функция range выдала диапазон чисел от 1 до len(a) которые по очереди выдает вам цикл. при этом вы удаляете элементы и список укорачивается но цикл и range увы об этом не знают и продолжают вам выдавать индексы которых уже нет. удалять элементы из списка при итерации от начала списка очень безнадежная затея. надо с конца. то есть развернуть индексы от конечного к первому
Python
1
2
3
4
5
6
7
a=[22,33,44,5,6,66,66,7,18,18,109,109]
for i in range(1,len(a))[::-1]:
    print(i)
    if a[i]== a[i-1]:
        a.pop(i)
 
print(a)
1
0 / 0 / 0
Регистрация: 19.01.2016
Сообщений: 9
18.09.2020, 18:44  [ТС]
Python
1
2
3
4
5
6
for i in range(1,len(a)):
    if a[i]==a[i-1]:
        for j in (i,len(a)-1):
            a[i]=a[i+1]
        a.pop()
print(a)
Я так понимаю, здесь аналогично, если делать со смещением?
0
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
18.09.2020, 18:48
Цитата Сообщение от Николай_39 Посмотреть сообщение
range
Вообще, всё дело в этом генераторе, который не меняется, в отличие от списка.
То есть, последний каждый раз уменьшается на 1, а в range последние индексы остаются, от он и доходит до них, а ображение к списку вызывает исключение.

По-этому нужно использовать цикл, который более еластичен, и ключевую переменную которого можно регулировать, то есть while:
Python
1
2
3
4
5
6
data = [22, 33, 44, 5, 6, 66, 66, 7, 18, 18, 18, 109, 109]
i = 0
while (i := i + 1) < len(data):
    if data[i] == data[i - 1]:
        del data[i - 1]
        i -= 1
Но, вообще, не желательно в цикле удалять елементы списка.
Более pythonic метод, который немного нарушает условие, потому как не записывает в конечный список значение, если оно равно предыдущему, но нам же важен результат:
Python
1
2
last = None
data = [last := it for it in data if it != last]
upd: пока я писал, вам уже сделали несколько вариантов.
P.S. Да, ещё более предпочтительно использовать оператор del вместо метода pop, если вам не нужно куда-то записать удаляемое значение.
0
0 / 0 / 0
Регистрация: 19.01.2016
Сообщений: 9
18.09.2020, 18:54  [ТС]
Спасибо!!!!!!!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38194 / 21127 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
18.09.2020, 19:18
Все уникальные элементы собираем в начало списка (в порядке следования).
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def del_dub(arr):
    i_p=0
    i_c=1
    n=len(arr)
    while(True):
        if i_c>=n:
            for i in range(i_p+1,n):
                arr.pop(i_p+1)
            return    
        if arr[i_c] != arr[i_p]:
            i_c+=1
            i_p+=1
        else:
            while(i_c<n):
                if arr[i_c] == arr[i_p]:
                    i_c+=1
                else:
                    i_p+=1
                    arr[i_p]=arr[i_c]
                    break
                
 
a=[22, 22, 33, 44, 5, 6, 66, 66, 7, 18, 18, 18, 109, 109]
del_dub(a)
print(a)
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
21.09.2020, 11:44
Посмотрите itertools.groupby.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2020, 11:44
Помогаю со студенческими работами здесь

Вроде несложная задачка
Всем привет. Задача Есть известная строка которая имеет hash (md5 например). &quot;Luck you aggressor&quot; Нужно подобрать...

Несложная задачка с массивом строк.
Народ, хелп! Вот суть: &quot;Есть массив строк. Нужно написать функцию, которая убирает дубликаты + unit tests к ней.&quot; Вот чё-то не...

Про массив задачка
На массивы вооще не могу решать задачи помогите! Во входном файле дана последовательность чисел. Требуется найти второе по величине число...

несложная задачка. нужно использовать записи и оператор with
Известны оценки каждого из 22 учеников класса по четырем предметам. Определить фамилию одного из учеников имеющего максимальную сумму...

Ещё одна задачка про Массив
Создать Массив с элементами: 2,2,7,5,3,4,4,10,6,6 Это делается так: Мас= Новый Массив; Мас.Добавить(2); Мас.Добавить(2); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru