2016-04-24 25 views
5

come suggerisce il titolo, ho sviluppato una funzione che, data una lista ascendente ORDINATO, si mantiene solo gli elementi che hanno una distanza di almeno k periodi ma lo fa modificando dinamicamente l'iteratore durante il ciclo. Mi è stato detto che questo deve essere evitato come la peste e, anche se non sono pienamente convinto del perché questa sia una cattiva idea, confido in coloro a cui mi sono appoggiato per la formazione e quindi per chiedere consigli su come evitare tale pratica Il codice è il seguente:mantenendo solo elementi di una lista ad una certa distanza di almeno - cambiare iteratore mentre loop - Python

import pandas as pd 
from datetime import days 
a = pd.Series(range(0,25,1), index=pd.date_range('2011-1-1',periods=25)) 
store_before_cleanse = a.index 

def funz(x,k): 
    i = 0 
    while i < len(x)-1: 
     if (x[i+1]-x[i]).days < k: 
      x = x[:i+1] + x[i+2:] 
      i = i-1 
     i = i + 1 
    return x 

print(funz(store_before_cleanse,10)) 

cosa si può fare per evitarlo? p.s .: non preoccuparti di soluzioni in cui l'elenco non è ordinato. la lista che verrà data sarà sempre ordinata in modo crescente.

risposta

1

Il più grande valore predefinito della funzione è avere una complessità quadratica, poiché x = x[:i+1] + x[i+2:] copia l'intero x ogni volta.

Il modo più semplice più efficiente per farlo vogliamo è probabilmente

a.resample('10D').first().index.

Se si preferisce un ciclo si può semplicemente fare:

def funz1(dates,k): 
    result=[dates[0]] 
    for date in dates: 
     if (date-result[-1]).days >= k: 
      result.append(date) 
    return result 
+0

Mi inchino prima della risposta. Così semplice ed elegante. grazie mille! – Asher11