Какой самый быстрый и эффективный способ удалить последовательные целые числа из списка?

#python #python-3.x #list

#python #python-3.x #Список

Вопрос:

Если у меня есть список типа: 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’, потому что оно было удалено, так что удалять его в цикле — плохая идея.

Ответ №1:

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

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

Это возвращает:

 [0, 19, 24]
  

Комментарии:

1. Если infs список большой, вы можете захотеть избежать копирования, которое infs[:1] infs будет сделано, используя chain(islice(infs, 1), infs) вместо этого (с chain и islice обоими исходящими из itertools ).

Ответ №2:

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

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

Это возвращает:

 [0, 19, 24]
  

Ответ №3:

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

 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]