2015-04-24 13 views
7

Tôi muốn quét một danh sách lớn cho các giá trị liên tiếp lớn hơn x. Ví dụ này x lớn hơn 1.0.Danh sách quét cho 5 giá trị liên tiếp lớn hơn x

Ví dụ,

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] 

tôi có thể tập hợp con danh sách này bằng

for i in range(0, len(my_list)): 
    subset = my_list[i:i+5] 

vì vậy tôi có được

[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 

cách tốt nhất để làm điều này là gì?

+0

Tạo danh sách tất cả các tập hợp con. Sau đó kiểm tra từng người trong số họ để xem liệu nó có đáp ứng tiêu chí của bạn hay không. – Barmar

Trả lời

3

Bạn có thể làm điều đó như sau:

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])] 
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] 

>>>x = 1.0 
>>>for i in range(0, len(my_list)): 
     subset = my_list[i:i+5] 
     if(all(item >x for item in subset)): 
      print subset 

[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] 
+0

Thao tác này sẽ không hoạt động đúng vào cuối danh sách. Nếu 5 phần tử cuối cùng lớn hơn 1.0, thì bạn sẽ nhận được '[n-4, n-3, n-2, n-1]', '[n-3, n-2, n-1]' , '[n-2, n-1]' và '[n-1]'. – cpburnz

1

Nó có thể tiết kiệm một số thời gian để giữ một bộ đếm do đó bạn không cần phải tiếp tục kiểm tra các giá trị đã được kiểm tra. Dưới đây n=5

def scan_k(arr, val,n): 
    counter = 0 
    results = set() 
    for i in range(len(arr)): 
     if arr[i] > val: 
      counter +=1 
     else: 
      counter = 0 
      continue 
     if counter >= n: 
      results.add(arr[(i-n+1):i]) 
return(results) 
2

Dưới đây là một itertools dựa phương pháp đó sẽ không cần thêm bất kỳ kết quả bộ nhớ và trả về như một máy phát điện:

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)] 

Các hàm được tham số hóa bởi ngưỡng và đếm, do đó bạn có thể tìm kiếm bất kỳ N giá trị liên tiếp. Bạn thậm chí có thể yếu tố ra điều kiện bằng cách đi qua trong một hàm cho rằng thay vì chỉ là một giá trị ngưỡng.

0

Dưới đây là một giải pháp nhanh chóng bằng cách sử dụng chức năng máy phát điện và một biến mà theo dõi những số gặp cho đến nay:

def find_n_consecutive_greater_than_x(mylist, n, x): 
    num_greater_than_x = 0 
    for index, val in enumerate(mylist): 
     if val > x: 
      num_greater_than_x += 1 
      if num_greater_than_x == n: 
       yield tuple(mylist[index-n+1:index+1]) 
       num_greater_than_x -= 1 
     else: 
      num_greater_than_x = 0 

mylist = [2]*6 
n = 5 
x = 1.0 

print(list(find_n_consecutive_greater_than_x(mylist, n, x))) 
# [(2, 2, 2, 2, 2), (2, 2, 2, 2, 2)] 

Đây sẽ là nhiều nhanh hơn so với bất kỳ giải pháp mà tính tất cả các lát có độ dài 5 một danh sách đã cho bởi vì nó chỉ xử lý từng phần tử một lần và tránh việc tạo ra các đối tượng, mà là chậm chạp trong hầu hết các triển khai Python.

Các vấn đề liên quan