[英]Remove items from a list in Python based on previous items in the same list
假设我有一个简单的数字列表,例如
simple_list = range(100)
我想缩短这个列表,例如值之间的间隙大于或等于5,所以它应该看起来像
[0, 5, 10...]
仅供参考,实际列表没有常规增量但是已经订购
我正在尝试使用列表理解来执行此操作,但下面显然会返回一个空列表:
simple_list2 = [x for x in simple_list if x-simple_list[max(0,x-1)] >= 5]
如果满足条件,我可以通过附加到列表来循环执行但是我特别想知道是否有使用列表理解的方法吗?
这不是理解的用例,你必须使用一个循环,因为它们之间可能存在少于五个的任意数量的元素,你不能只检查下一个或任意数量的数字,除非你知道数据有一些非常具体的格式:
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)
哪个会回归:
[1, 10, 18, 24]
如果您的数据始终按升序排列,则可以删除abs
,只要if ele - i >= 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)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.