Kako z zipom do zaporednih elementov

Recimo, da imam seznam in bi rad naredil seznam razlik zaporednih elementov. Torej, če imam seznam s = [5, 3, 8, 2, 1], bi rad pridelal seznam [2, -5, 6, 1] (ker je 5 - 3 = 2, 3 - 8 = -6, 8 - 2 = 6, 2 - 1 = 1).

Neučakani naredijo tole

t = [] for i in range(1, len(s)): t.append(s[i - 1] - s[i])

To je pravilno, ni pa elegantno in ne vodi daleč. Obstaja boljši način.

Vemo, da s[1:] odbije prvi element seznama. Imamo torej

>>> s [5, 3, 8, 2, 1] >>> s[1:] [3, 8, 2, 1]

Seznama zazipamo.

>>> zip(s, s[1:]) [(5, 3), (3, 8), (8, 2), (2, 1)]

Dobili smo seznam parov zaporednih elementov. Z zanko gremo čez te pare, jih razpakiramo, odštevamo in zlagamo v nov seznam. Obljubljena boljša rešitev te naloge je torej:

t = [] for e1, e2 in zip(s, s[1:]): t.append(e1 - e2)

Če znamo razmišljati tako, bomo kasneje, ko pride na vrsto, tudi lažje razumeli krajšo rešitev:

t = [e1 - e2 for e1, e2 in zip(s, s[1:])]
Zadnja sprememba: torek, 28. oktober 2014, 20.31