我有一些来自传感器的值。我的任务是将它们分成三个要素的列表。如果两个连续元素相差至少10,我应该忽略列表的其余部分。
由此:
values = [1,3,6,8,9,11,15,17,28,29]
我应该得到:
[1,3,6]
[8,9,11]
[15,17]
我设法按三个列表划分值:
list_of_values = [1,3,6,8,9,11,15,17,28,29]
def divide(values, size):
return (values[pos:pos + size] for pos in range(0, len(values), size))
for group in divide(list_of_values, 3):
print(group)
但我无法弄清楚如何比较上一个和下一个值,就像任务所说的那样。
答案 0 :(得分:1)
在将列表分成三元组之前,您需要找到该断点。迭代循环,寻找差异。为方便阅读,我打算拨打您的列表vals
,而不是list_of_values
。
for gap in range(1, len(vals)):
if vals[gap] - vals[gap-1] >= 10:
break
此时,gap
是您排除的第一个元素的位置。
vals = vals[:gap]
现在您已准备好拆分列表。
答案 1 :(得分:1)
这是另一种方法。您可以使用列表推导找到连续元素之间的绝对差异
diff = [abs(values[i+1]-values[i]) for i in range(len(values)-1)]
您可以使用基于this post的生成器找到第一个大于10的差异,
ind = (i for i,v in enumerate(diff) if v >= 10).next()
lst = values[:ind+1];
lst
现在是你缩短的列表 - 即列出直到并且不包含第一个值相差10的列表。
最后,使用this post中的方法,缩短列表lst
可以拆分为小于或等于3的块,
n = 3
print [lst[i:i + n] for i in range(0, len(lst), n)]
答案 2 :(得分:1)
您可以使用zip和切片来配对列表的连续元素:
import itertools
diff_less_than_10 = ((a - b < 10)
for a, b in zip(list_of_values[1:], list_of_values))
end = 1 + sum(itertools.takewhile(bool, diff_less_than_10))
groups = divide(list_of_values[:end], size)
答案 3 :(得分:1)
首先,计算index
在哪里停止 chunking
:
stp = [i for i in range(len(values)-1) if values[i]+10 < values[i+1]] [0]
然后chunk
到此index
:
[values[:stp+1][i:i+3] for i in range(0, stp, 3)]
outputs
:
[[1, 3, 6], [8, 9, 11], [15, 17]]