Я пытаюсь найти самый питонический способ выяснить, являются ли числа в списке последовательными. Чтобы дать некоторую предысторию, у меня есть список собранных номеров, которые существуют в папке, и мне нужно выяснить, какие номера отсутствуют.
Я собираю все числа, а затем составляю другой список из диапазона (начало, конец + 1) того, какие числа должны быть там. Я очень легко сделал что-то, чтобы показать мне все пропущенные цифры:
missing = [x for x in existingNumbers if x not in shouldBeNumbers]
Проблема в том, что, если я распечатаю все эти числа, многие цифры могут быть сжаты (т.е. 1, 2, 3, 4, 7, 10 могут быть напечатаны как 1-4, 7, 10) потому что может отсутствовать огромное количество цифр.
Я пробовал два подхода:
Для обоих способов frameRange - это range (startFrame, endFrame + 1), а frameList - это список, сгенерированный из того, что существует в настоящее время.
1)
for x in frameRange:
if x not in frameList:
if originalFrame == None:
originalFrame = x
elif originalFrame:
if lastFrame == None:
lastFrame = x
elif lastFrame:
if lastFrame == x-1:
lastFrame = x
else:
if originalFrame != lastFrame:
missingFrames.append(str(originalFrame)+"-"+str(lastFrame))
originalFrame = x
lastFrame = x
else:
missingFrames.append(str(originalFrame))
originalFrame = x
lastFrame = x
if x == endFrame:
if originalFrame != lastFrame:
missingFrames.append(str(originalFrame)+"-"+str(lastFrame))
originalFrame = x
lastFrame = x
else:
missingFrames.append(str(originalFrame))
originalFrame = x
lastFrame = x
2)
i = 0
while i < len(frameRange):
if frameRange[i] in frameList:
i += 1
else:
if i + 1 < len(frameRange):
if frameRange[i + 1] in frameList:
missingFrames.append(str(frameRange[i]))
i += 1
else:
j = 1
while frameRange[i+j] not in frameList:
aheadFrameNumber = int(str(j))
if i + j + 1 < len(frameRange):
j += 1
else:
break
missingFrames.append(str(frameRange[i])+"-"+str(frameRange[aheadFrameNumber]))
if i + aheadFrameNumber + 1 < len(frameRange):
i += aheadFrameNumber + 1
else:
missingFrames.append(str(frameRange[i]))
Первый способ работал, но так как это происходит в текущем кадре с проверкой последнего, всякий раз, когда последний кадр пропал, он не будет добавлять последний отсутствующий раздел в список. Во-вторых, мне приходилось все время заключать в операторы if, потому что я продолжал получать исключения индекса при движении вперед.
Я думаю, что должен отступить, переосмыслить и подойти к этому по-другому. Мне интересно, есть ли гораздо лучший способ сделать это в Python, о котором я еще не думал, потому что я не знаю эту функцию. Оба способа начали немного выходить из-под контроля.