Почему моя программа удаляет только все остальные символы в списке? - PullRequest
0 голосов
/ 23 октября 2018

Итак, я не понимаю, почему мои выходные данные возвращаются [1, 1, 3, 1, 3], когда то, что я хочу и думал, было [1,1,1].

the_list = [1, 2, 1, 2, 3, 1, 2, 3, 4]
target = 1

def keep(the_list, target):
    index = 0
    for x in the_list:
        if x != target:
            del the_list[index]
        else:
            pass

        index += 1
print(the_list)

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Когда вы удаляете элемент из списка по определенному индексу, все элементы после указанного индекса перемещаются вперед на 1, так как в списке не может быть пропуска, поэтому после удаления 2 по индексу 1 Например, в следующей итерации x станет 2 в индексе 2, когда он был в индексе 3, поэтому ваша собственная переменная index будет указывать на неправильный элемент.

Чтобы удалить элементы из списка на месте, вы должны вместо этого считать в обратном направлении от конца списка, чтобы повторная индексация списка после удаления элемента не повлияла на точность вашего index counter:

def keep(the_list, target):
    index = len(the_list) - 1
    while index >= 0:
        if the_list[index] != target:
            del the_list[index]
        index -= 1

, чтобы:

the_list = [1, 2, 1, 2, 3, 1, 2, 3, 4]
target = 1
keep(the_list, target)
print(the_list)

выводил:

[1, 1, 1]

Но имейте в виду, что удаление элемента из списка по своей сути неэффективнопоскольку средняя сложность по времени составляет O (n) для необходимости перемещения элементов после заданного индекса, удаление нескольких элементов из списка становится квадратичным по сложности.Гораздо эффективнее использовать понимание списка для создания нового списка из старого, сохраняя только те элементы, которые равны целевому значению.Таким образом, даже несмотря на то, что приведенный выше код показывает вам, как правильно удалять элементы из списка на месте, вы не должны использовать его в любом рабочем коде.

0 голосов
/ 23 октября 2018

Будет намного чище, если вы будете использовать понимание списков для проверки элементов списка и возвращать только то, что вам нужно.

the_list = [1, 2, 1, 2, 3, 1, 2, 3, 4]
target = 1

new_list = [i for i in the_list if i == target]

Понятия списков гораздо более читабельны, поскольку их намерение явно.Цикл может использоваться для множества разных вещей, таких как более сложные агрегации или более сложные задачи обработки.Напротив, понимание списка подразумевается только для одной вещи - построения нового списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...