#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]