функция, которая заменяет последовательные повторяющиеся элементы списка одним элементом - PullRequest
1 голос
/ 06 апреля 2020

Что я пробовал:

def compress(l):
    i = 0
    while i < len(l)-1:
        if l[i] == l[i+1]:
            del l[i]
        else:
            i = i+1
l = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5]
compress(l)

Я не знаю многих функций в python, так как я только начал, поэтому я хотел бы сделать это базовым c способом, то есть с использованием for и while циклы и некоторые методы списка. Что я делаю неправильно? Любые другие методы Еще один, который я попробовал, что не так в этом:

def compress(l):
    for i in l:
        if l[i] == l[i+1] and i != (len(l) - 1):
            l.pop(l[i])

        print(l)
l = [1,1,1,1,2,2,2,2,2,2,3,3,3,4,5,6,7,8]
compress(l)

, который дает мне вывод:

[1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 3, 3, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 3, 3, 3, 4, 5, 6, 7, 8]

Ответы [ 3 ]

3 голосов
/ 06 апреля 2020

Вы, похоже, не делаете что-либо неправильно (a) с первой попытки, за исключением того, что вы не печатаете сжатый список. Это можно исправить, добавив в качестве последней строки:

print(l)

В этот момент вы должны увидеть:

[1, 2, 3, 4, 5]

, как я.


Ваша вторая попытка проблематична c - это обычное явление, когда вы изменяете список, для которого вы выполняете итерацию. Поскольку итерация эффективно проверяет на основе индекса, вставка элементов перед текущей точкой может привести к двойной обработке элементов. Кроме того, удаление элементов в текущей точке или до нее может привести к тому, что элементы вообще не будут обрабатываться.

Этот последний случай - то, что происходит во второй попытке.


( а) Возможно, вы могли бы выбрать более описательные имена для ваших переменных, чем l, но это мое предпочтение.

1 голос
/ 06 апреля 2020

Поскольку вы запрашиваете другие методы, следует отметить, что повторное удаление из списка имеет плохую производительность, так как все хвостовые элементы должны быть сдвинуты для каждого удаления. Создание сжатого списка с нуля обходится дешевле, а назначение фрагментов позволяет изменять исходный список. Используя циклы basi c и методы списка, я бы сделал:

def compress(l):
    new_l = l[:1]
    for x in l:
        if x != new_l[-1]:
             new_l.append(x)
    l[:] = new_l

Для однострочной альтернативы, использующей более продвинутые средства (itertools.groupby), вы можете сделать:

from itertools import groupby

def compress(l):
    l[:] = [k for k, _ in groupby(l)]
0 голосов
/ 06 апреля 2020

Вам не нужно так стараться удалять дублирующиеся элементы в списке:

print(list(set(l)))

это удалит все дублирующиеся элементы в списке.

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