32 Stimmen

Kann ich mich darauf verlassen, dass die Reihenfolge in einem Python-Tupel erhalten bleibt?

Ich habe eine Liste von Zeitpunkten, aus denen ich Zeitsegmente konstruieren möchte. Mit anderen Worten, drehen Sie [t0, t1, ... tn] in [(t0,t1),(t1,t2),...,(tn-1, tn)] . Ich habe es auf diese Weise gemacht:

# start by sorting list of datetimes
mdtimes.sort()
# construct tuples which represent possible start and end dates

# left edges
dtg0 = [x for x in mdtimes]
dtg0.pop()

# right edges
dtg1 = [x for x in mdtimes]
dtg1.reverse()
dtg1.pop()
dtg1.sort()

dtsegs = zip(dtg0,dtg1)

Fragen...

  1. Kann ich mit tn-1 < tn für alle (tn-1,tn) rechnen, nachdem ich sie auf diese Weise erstellt habe? (Wird die Reihenfolge beibehalten?)
  2. Ist es eine gute Praxis, das Original zu kopieren? mdtimes Liste mit Listenverständnissen? Wenn nicht, wie sollte es gemacht werden?
  3. Der Zweck der Konstruktion dieser Tupel besteht darin, über sie zu iterieren und einen Datensatz mit tn-1 y tn . Ist dies ein vernünftiger Ansatz, d. h.

    datasegment = [x for x in bigdata if ( (x['datetime'] > tleft) and (x['datetime'] < tright))] 

Danke

3voto

John Machin Punkte 78125

Dies ist eine Antwort auf die Frage "Ist dies ein vernünftiger Ansatz?" (die anscheinend von allen ignoriert wurde).

Zusammenfassung: Vielleicht möchten/müssen Sie Ihren Blick davon abwenden, eine paarweise Sache aus mdtimes zum übergreifenden Problem (Segmentierung bigdata ).

Einzelheiten:

Die gewünschte Verwendung des Ergebnisses wird wie folgt ausgedrückt:

datasegment = [x for x in bigdata if ( (x['datetime'] > tleft) and (x['datetime'] < tright))] 

was besser ausgedrückt wird als:

datasegment = [x for x in bigdata if tleft < x['datetime'] < tright] 

Beachten Sie, dass in dieser Form keine Fälle berücksichtigt werden, in denen der Zeitstempel genau mit einem der Grenzpunkte übereinstimmt, also ändern wir es in:

datasegment = [x for x in bigdata if tleft <= x['datetime'] < tright]

Aber das wird in einer Schleife erscheinen:

for tleft, tright in dtsegs:
    datasegment = [x for x in bigdata if tleft <= x['datetime'] < tright]
    do_something_with(datasegment)

Hoppla! Das kostet Zeit, die proportional zu den len(bigdata) * len(dtsegs) ... was sind die wahrscheinlichen Werte von len(bigdata) y len(dtsegs) ?

Wenn bigdata sortiert ist, kann das, was Sie tun wollen, in einer Zeit erledigt werden, die proportional ist zu N donde N = len(bigdata) . Si bigdata noch nicht sortiert ist, kann es in einer Zeit sortiert werden, die proportional ist zu N * log(N) .

Vielleicht möchten Sie eine andere Frage stellen ...

Es sollte auch darauf hingewiesen werden, dass alle Artikel in bigdata die einen Zeitstempel < min(mdtimes) oder >= max(mdtimes) haben, werden in keinem Datensegment berücksichtigt ... ist das beabsichtigt?

1voto

flamingspinach Punkte 41

Ich bin kein Experte, aber vervierfachen Sie nicht Ihren Speicherbedarf, wenn Sie die Liste kopieren und dann eine neue Liste mit Paaren aus zwei Listen erstellen? Warum machen Sie nicht einfach das Folgende:

dtsegs = [(dtg0[i], dtg0[i+1]) for i in range(len(dtg0)-1)]

Ich weiß allerdings nicht, wie "pythonisch" das ist.

EDIT: Eigentlich, wenn man bedenkt, was Sie mit dieser Liste von Tupeln tun müssen, könnten Sie nur diese [i] und [i+1] Zeug direkt auf dieser Ebene tun und nicht einmal diese neue Struktur überhaupt erstellen. Ich weiß nicht, mit wie vielen Daten Sie zu tun haben, obwohl - wenn es eine kleine Zahl ist, nehme ich an, dass es nicht wirklich wichtig ist.

Was auch immer es wert ist, ein paar der anderen Antwortenden hier scheinen Ihre Frage falsch zu verstehen, obwohl ich ihre Beiträge nicht kommentieren kann, da ich noch nicht genug Ansehen habe :) Die Lösung von Ignacio Vazquez-Abrams scheint mir die beste zu sein, obwohl sein "next(dtg0)" wahrscheinlich "next(dtg1)" sein sollte (?)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X