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

22voto

moinudin Punkte 125641
  1. Die Reihenfolge der Tupel ist so, wie Sie die Werte in die Tupel einfügen. Sie werden nicht sortiert werden, wie ich denke, Sie fragen. zip behält wiederum die Reihenfolge bei, in der Sie die Werte eingefügt haben.

  2. Das ist eine akzeptable Methode, aber ich habe 2 alternative Vorschläge: Verwenden Sie die kopieren. Modul, oder verwenden Sie dtg1 = mdtimes[:] .

  3. Klingt vernünftig.

22voto

Beide list y tuple bestellt werden.

dtg0, dtg1 = itertools.tee(mdtimes)
next(dtg0)
dtsegs = zip(dtg0, dtg1)

6voto

Paweł Nadolski Punkte 8097

Das Gleiche können Sie erreichen mit zip :

>>> l = ["t0", "t1", "t2", "t3", "t4", "t5", "t6"]
>>> zip(l[::2], l[1::2])
[('t0', 't1'), ('t2', 't3'), ('t4', 't5')]

4voto

Eli Bendersky Punkte 246100

Anstelle von: dtg0 = [x for x in mdtimes] , dtg0 = mdtimes[:] ausreichen, da Sie nur eine Liste in eine andere kopieren. Hinweis: Ab Python 3.3 können Sie einfach sagen newlist = oldlist.copy()

Was die Reihenfolge betrifft, zip Die Reihenfolge von Listen und Tupeln ist gut definiert, und sowohl Listen als auch Tupel sind geordnete Sammlungen, so dass Sie hier keine Probleme haben sollten.

4voto

tokland Punkte 63238

Die Umwandlung von (x1, x2, x3, ...) in [(x1, x2), (x2, x3), ...] wird als paarweise Kombination bezeichnet und ist ein so häufiges Muster, dass die itertools Die Dokumentation enthält ein Rezept:

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

for ta, tb in pairwise(mdtimes): 
    ....

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