根据同一列表中的先前项目从 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
。
假设我有一个简单的数字列表,例如
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
。