2017-02-27 5 views
2

Ich habe eine Liste der DOY-Daten. Die Liste ist fast 900.000 Einträge lang. Das Problem, das ich habe, ist, dass die Daten zunächst bis zu 365 gehen, aber dann beginnt bei 1 wieder, wenn ich es möchte Vergangenheit 365. Zum Beispiel gehen:schnellste Möglichkeit, eine große Liste zu teilen

>>> continue_list([140, 141, 145, 270, 365, 365.90, 1, 2, 5, 360]) 
>>> [140, 141, 145, 270, 365, 365.90, 366, 367, 370, 725] 

Hier ist mein Versuch:

def continue_list(x): 
    l = [] 
    m = [] 
    for i in x: 
     if math.floor(i) == 1: 
      l = l+ x[x.index(i):] 
      l = list(map(lambda x: x+365, l)) 
      m = m + x[:x.index(i)] 
      new_x = m + l 
    return new_x 

Dies funktioniert perfekt für kleine Listen. Aber für eine Liste mit 900.000 Einträgen ist es nicht machbar; Mein Computer stürzt sofort ab. Irgendwelche Tipps für einen schnelleren Ansatz?

+0

Ich bin nicht klar, wo die "Split" kommt oder wie Sie Ihre erwartete Ausgabe erhalten; Was passiert, wenn Sie mehrere Jahreszyklen durchlaufen? Wie berechnen Sie die Gesamtzahl der Tage, die diesen Werten hinzugefügt werden? Und was passiert, wenn ein Jahr komplett verpasst wird? – roganjosh

+0

Ist 365 ein konstanter Offset oder kann es sich ändern? Es ist nicht klar, aus Ihrem Beispiel und Code –

Antwort

1

würde ich einen Generator empfehlen:

l = [140, 141, 145, 270, 365, 365.90, 1, 2, 5, 360, 1] 

def wrap_at_365(it): 
    # The number of wraps that have been found. 
    wraps = 0 
    it = iter(it) 
    # Get the first item 
    last = next(it) 
    yield last 
    for item in it: 
     # Identify a wrap by checking if the next item is smaller than the previous 
     if item < last: 
      wraps += 1 
     yield item + 365 * wraps 
     last = item 

Es kann sofort auf ein list gewirkt:

>>> list(wrap_at_365(l)) 
[140, 141, 145, 270, 365, 365.9, 366, 367, 370, 725, 731] 

Auf meinem Computer es in etwa 0,5 s dauert eine Liste mit 1 Million Zahlen zu konvertieren.


jedoch die Anzahl der Zeiten, die Sie vorsichtig sein müssen zu identifizieren. Ich habe überprüft, dass der letzte Artikel größer ist als der aktuelle, aber was ist, wenn es in Jahr 1 100 ist und der nächste Artikel 110 in Jahr2 darstellt? Das wird unentdeckt bleiben und ich weiß nicht, wie ich das erkennen soll. Enthält Ihre Daten mehr Details? Und was ist mit Schaltjahren?

+0

alle meine Daten in etwa in der gleichen Form kommt. beginnt etwa am 140. Tag des ersten Jahres und endet kurz vor dem 365. Tag des zweiten Jahres. Die Funktion, die du gabst, funktionierte perfekt, danke für deine Hilfe! –

1

Wenn Sie die Daten aus einer Datei lesen, sollten Sie versuchen, auf kleineren Abschnitten der Datei gleichzeitig zu arbeiten. Wenn Sie die Daten verarbeiten, hängen Sie die Ausgabe an eine Ausgabedatei an. Lesen Sie beispielsweise die ersten 1000 Zeilen der Datei. Verarbeite sie und schreibe sie dann in das Outfile. Dann weiter zu den nächsten 1000 Zeilen. Auf diese Weise muss Python nicht alle 900k Zeilen im Speicher behalten. Die Zeilen, die zuvor verarbeitet wurden, werden mit dem Müll gesammelt.

Verwandte Themen