根据同一列表中的先前项目从 Python 中的列表中删除项目

Remove items from a list in Python based on previous items in the same list

假设我有一个简单的数字列表,例如

simple_list = range(100)

我想缩短这个列表,例如让值之间的差距大于或等于 5,所以它应该看起来像

[0, 5, 10...]

仅供参考,实际列表没有规律的递增,但它是有序的

我正在尝试使用列表理解来做到这一点,但下面显然 returns 是一个空列表:

simple_list2 = [x for x in simple_list if x-simple_list[max(0,x-1)] >= 5]

如果满足条件,我可以通过附加到列表来循环执行此操作,但我特别想知道是否有使用列表理解来执行此操作的方法?

如果我正确理解了你的问题(我不确定我理解的是什么(请澄清)),你可以轻松地做到这一点。假设 a 是您要处理的列表。

[v for i,v in enumerate(a) if abs(a[i] - a[i - 1]) >= 5]

这给出了与前一个(应该是下一个?)的差异大于或等于 5 的所有元素。根据您的需要,它有一些变化。不应该比较和排除第一个元素吗?之前的实现将它与索引 -1 进行比较,如果满足条件则包含它,这个将它从结果中排除:

[v for i,v in enumerate(a) if i != 0 and abs(a[i] - a[i - 1]) >= 5]

另一方面,是否应该始终包含它?然后使用这个:

[v for i,v in enumerate(a) if (i != 0 and abs(a[i] - a[i - 1]) >= 5) or (i == 0)]

这不是推导式的用例,您必须使用循环,因为可以有任意数量的元素在一起,而它们之间的元素少于五个,您不能只检查下一个或任意 n 个数字除非你知道数据有一些非常具体的格式:

simple_list = range(100)

def f(l):
    it = iter(l)
    i =  next(it)
    for ele in it:
        if abs(ele - i) >= 5:
            yield i
            i = ele
    yield i


simple_list[:] = f(simple_list)
print(simple_list)
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

一个更好的例子是:

l = [1, 2, 2, 2, 3, 3, 3, 10, 12, 13, 13, 18, 24]

l[:] = f(l)

print(l)

哪个 return:

[1, 10, 18, 24]

如果您的数据始终按升序排列,您可以删除 abs,只删除 if ele - i >= 5