Python 什么';删除列表中连续整数的最快、最有效的方法是什么?

Python 什么';删除列表中连续整数的最快、最有效的方法是什么?,python,python-3.x,list,Python,Python 3.x,List,如果我有这样一个列表: 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”,因为它已被删除,所以在循环中删除它是个坏主意。您可以在给定列表的枚举

如果我有这样一个列表:
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”,因为它已被删除,所以在循环中删除它是个坏主意。

您可以在给定列表的枚举上使用
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, 19, 24]

您可以通过压缩列表本身来配对列表中的相邻项,但要填充其第一项,这样您就可以使用列表理解来过滤出仅相差1的相邻项对:

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

[0, 19, 24]
[0, 19, 24]

您只需执行以下操作:

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]


如果
infs
是一个大列表,您可能希望避免
infs[:1]+infs
通过使用
chain(islice(infs,1),infs)
而产生的副本(使用
chain
islice
都来自
itertools
)。