2

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

4

3 回答 3

4

您可以通过将列表与其自身压缩但对其第一项进行填充来配对列表中的相邻项目,以便您可以使用列表推导过滤掉仅相差 1 的相邻对:

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

这将返回:

[0, 19, 24]
于 2019-04-08T16:58:41.813 回答
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]
于 2019-04-08T16:50:49.117 回答
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]

于 2019-04-08T17:59:44.480 回答