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)
做这个的最好方式是什么?
这是一种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 个连续值。您甚至可以通过传入一个函数而不仅仅是阈值来分解条件。
您可以按如下方式执行此操作:
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)
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |