将值除以三个列表并比较其中的元素

时间:2017-11-15 19:17:59

标签: python python-3.x

我有一些来自传感器的值。我的任务是将它们分成三个要素的列表。如果两个连续元素相差至少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)

但我无法弄清楚如何比较上一个和下一个值,就像任务所说的那样。

4 个答案:

答案 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]]