Какой самый быстрый и эффективный способ удалить последовательные целые числа в списке? - PullRequest
2 голосов
/ 08 апреля 2019

Если у меня есть список вроде: infs = [0, 19, 20, 21, 24] Я хотел бы удалить последовательные значения, но оставить первое только из этой группы, поэтому здесь я ожидаю результата: infs = [0, 19, 24]

Мои попытки:

 for k,(i,j) in enumerate(zip(infs, infs[1:])):
        print(k,i,j)
        if j-i == 1:
            del infs[k+1]

Он оставляет «21», потому что он был удален, так что это плохая идея, чтобы удалить его в цикле.

Ответы [ 3 ]

4 голосов
/ 08 апреля 2019

Вы можете создать пару смежных элементов в списке, сжав список по себе, но с отступом его первого элемента, так что вы можете использовать понимание списка, которое отфильтровывает соседние пары, отличающиеся всего на 1:

[b for a, b in zip(infs[:1] + infs, infs) if b - a != 1]

Возвращает:

[0, 19, 24]
1 голос
/ 08 апреля 2019

Вы можете использовать itertools.groupby над перечислением данного списка, с ключевой функцией, которая возвращает разницу между числом и его индексом:

from itertools import groupby
[next(g)[1] for _, g in groupby(enumerate(infs), lambda t: t[1] - t[0])]

Возвращает:

[0, 19, 24]
0 голосов
/ 08 апреля 2019

Вы можете просто сделать:

infs=[0, 19, 20, 21, 24]
[v for (i, v) in enumerate(infs) if i==0 or v - infs[i-1] != 1]

[0, 19, 24]

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