2015-04-24 17 views
7

Desidero eseguire la scansione di un elenco di grandi dimensioni per valori consecutivi maggiori di x. Questo esempio x è maggiore di 1.0.Elenco di scansione per 5 valori consecutivi maggiori di x

Per esempio,

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] 

posso sottoinsiemi questa lista

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

così ottengo

[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 

Qual è il modo migliore per farlo?

+0

Creare un elenco di tutti i sottoinsiemi. Quindi prova ognuno di loro per vedere se soddisfa i tuoi criteri. – Barmar

risposta

3

Potete farlo come segue:

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

Questo non funzionerà correttamente alla fine dell'elenco. Se gli ultimi 5 elementi sono maggiori di 1.0, otterrai '[n-4, n-3, n-2, n-1]', '[n-3, n-2, n-1]' , '[n-2, n-1]' e '[n-1]'. – cpburnz

1

Potrebbe risparmiare un po 'di tempo per mantenere un contatore in modo che non c'è bisogno di continuare a controllare i valori che sono già controllati. Qui 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

Ecco un approccio basato itertools che non avrà bisogno di alcun memoria e restituisce i risultati in più come un generatore:

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

La funzione viene parametrizzata dalla soglia e contare in modo da poter cercare qualsiasi N valori consecutivi. Potresti anche calcolare la condizione passando una funzione per quella invece di un valore di soglia.

0

Ecco una soluzione veloce utilizzando una funzione di generatore e una variabile che tiene traccia del numero incontrato finora:

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

Questo sarà molto più velocemente di qualsiasi soluzione che calcola tutte le fette di lunghezza 5 di un elenco dato perché elabora solo ogni elemento una sola volta ed evita la creazione di oggetti, che è dolorosamente lento nella maggior parte delle implementazioni Python.

Problemi correlati