假设我有一个简单的数字列表,例如
$table[] = array_merge($row['id'], json_decode('details'))
我想缩短此列表,例如值之间的间隙大于或等于5,因此它应该看起来像
simple_list = range(100)
仅供参考,实际列表没有常规增量,但已订购
我正在尝试使用列表推导来执行此操作,但下面显然会返回一个空列表:
[0, 5, 10...]
如果符合条件,我可以通过附加到列表来循环执行但是我特别想知道是否有使用列表理解的方法吗?
答案 0 :(得分:3)
这不是用于理解的用例,你必须使用一个循环,因为它们之间可能存在少于五个的任何数量的元素,你不能只检查下一个或任何数量的数字,除非你知道数据有一些非常具体的格式:
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
。
答案 1 :(得分:0)
如果我理解你的问题,我不确定(请澄清),你可以轻松地做到这一点。假设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)]