扫描列表连续5个大于x的值

Rod*_*mos 9 python list subset

我想扫描大型列表中的连续值大于x.此示例x大于1.0.

例如,

my_list = [0.2, 0.1, 0.3, 1.1, 0.7, 0.5, 1.2, 1.3, 1.4, 1.2, 1.9, 1.1, 0.2, 1.3, 1.5, 1.4, 1.2, 1.1, 0.2, 1.3, 0.1., 1.6, 0.2, 0.5, 1.0, 1.1, 0.2]
Run Code Online (Sandbox Code Playgroud)

我可以按此列出这个列表

for i in range(0, len(my_list)):
    subset = my_list[i:i+5]
Run Code Online (Sandbox Code Playgroud)

所以我明白了

[0.2, 0.1, 0.3, 1.1, 0.7]
[0.1, 0.3, 1.1, 0.7, 0.5]
[0.3, 1.1, 0.7, 0.5, 1.2]
[1.1, 0.7, 0.5, 1.2, 1.3]
[0.7, 0.5, 1.2, 1.3, 1.4]
[0.5, 1.2, 1.3, 1.4, 1.2]
[1.2, 1.3, 1.4, 1.2, 1.9] <-- values I want
[1.3, 1.4, 1.2, 1.9, 1.1] <-- values I want
[1.4, 1.2, 1.9, 1.1, 0.2]
[1.2, 1.9, 1.1, 0.2, 1.3]
[1.9, 1.1, 0.2, 1.3, 1.5]
[1.1, 0.2, 1.3, 1.5, 1.4]
[0.2, 1.3, 1.5, 1.4, 1.2]
[1.3, 1.5, 1.4, 1.2, 1.1] <-- values I want
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?

tza*_*man 5

这是一种itertools基于方法,不需要任何额外的内存并将结果作为生成器返回:

from itertools import tee, islice

def find_consecutive(the_list, threshold, count=5):
    my_iters = tee(the_list, count)
    for i, it in enumerate(my_iters):
        next(islice(it, i, i), None)
    return (f for f in zip(*my_iters) if all(x > threshold for x in f))

my_list = [0.2, 0.1, 0.3, 1.1, 0.7, 0.5, 1.2, 1.3, 1.4, 1.2, 1.9, 1.1, 0.2, 1.3, 1.5, 1.4, 1.2, 1.1, 0.2, 1.3, 0.1, 1.6, 0.2, 0.5, 1.0, 1.1, 0.2]
list(find_consecutive(my_list, 1.0))
# [(1.2, 1.3, 1.4, 1.2, 1.9),
# (1.3, 1.4, 1.2, 1.9, 1.1),
# (1.3, 1.5, 1.4, 1.2, 1.1)]
Run Code Online (Sandbox Code Playgroud)

该函数通过阈值和计数进行参数化,因此您可以查找任意 N 个连续值。您甚至可以通过传入一个函数而不仅仅是阈值来分解条件。


ssh*_*124 3

您可以按如下方式执行此操作:

my_list = [0.2, 0.1, 0.3, 1.1, 0.7, 0.5, 1.2, 1.3, 1.4, 1.2, 1.9, 1.1, 0.2, 1.3, 1.5, 1.4, 1.2, 1.1, 0.2, 1.3, 0.1, 1.6, 0.2, 0.5, 1.0, 1.1, 0.2]

x = 1

result = [my_list[i:i+5] for i in range(len(my_list)-4) if all(i > x for i in my_list[i:i+5])]
Run Code Online (Sandbox Code Playgroud)