Удаление/исключение элементов списка по индексам, полученным из значений другого списка

Рейтинг: 0Ответов: 1Опубликовано: 04.05.2023

Как исправить? Получается пройти цикл должен один раз, и сразу перезаписываться по нужному условию, у меня проходит много раз.


Дано два списка:

zone=[2, 2, 3, 6, 6, 7, 7, 8, 8, 9, 9]
dupdup=[1, 4, 6, 8, 10]

Список dupdup, содержит номера индексов, которые нужно -удалить/исключить/не записывать- из списка zone.

newzone=[]
for i,x in enumerate(zone):
    for k in (dupdup):
        if k!=i:
            newzone.append(x)
print("newzone",newzone)

На выходе получается:


newzone [2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9].


А должно получиться так:


newzone [2, 3, 6, 7, 8, 9].

Ответы

▲ 1

Лучше преобразовать list - dupdup в set и проверять находится ли index в множестве, так как:

  • Проверка in list занимает О(n) времени, т.е при каждой проверке in будет проверяться каждый элемент находящийся в списке пока не найдется искомый.
  • Проверка in set занимает O(1) времени, т.е элемент находится за константное время, так элемент находится по hash значению.

И список newzone можно формировать с помощью list comprehension что также ускорит работу программы

zone = [2, 2, 3, 6, 6, 7, 7, 8, 8, 9, 9]
dupdup = {1, 4, 6, 8, 10}
newzone = [num for i, num in enumerate(zone) if i not in dupdup]
print(newzone)

Вывод:

[2, 3, 6, 7, 8, 9]

Временная сложность - различных операций в python