如果我有类似这样的列表:
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',因此将其循环删除是个坏主意。
答案 0 :(得分:4)
您可以通过将列表本身与自己的列表进行压缩,但在列表的第一项上填充一下,从而将列表中的相邻项配对,这样您就可以使用列表理解功能过滤出仅相差1的相邻对。
[b for a, b in zip(infs[:1] + infs, infs) if b - a != 1]
这将返回:
[0, 19, 24]
答案 1 :(得分:1)
您可以在给定列表的枚举上使用itertools.groupby
,并使用键函数返回数字与其索引之间的差:
from itertools import groupby
[next(g)[1] for _, g in groupby(enumerate(infs), lambda t: t[1] - t[0])]
这将返回:
[0, 19, 24]
答案 2 :(得分:0)
您可以执行以下操作:
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]