我试图找到最pythonic的方法来找出列表中的数字是否是连续的。为了提供一些背景信息,我收集了一个文件夹中存在的数字列表,我需要找出缺少哪些数字。
我收集了所有的数字,然后从范围(开始,结束+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 中是否有更好的方法来做到这一点,我还没有考虑过,因为我不知道这个函数。两种方式都开始有点失控了。