Seite 1 von 1
reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 09:46
von jens
Brauche ein enumerate() nur umgekehrt. Also quasi: reversed(enumerate())
Mal ein Beispiel:
Code: Alles auswählen
t = ["a","b","c"]
for no, x in enumerate(t):
print no, x
print "---"
for no in xrange(len(t)-1, -1, -1):
print no, t[no]
Ausgabe ist:
0 a
1 b
2 c
---
2 c
1 b
0 a
Das zweite ist das was ich brauche... Aber die xrange() Geschichte ist IMHO unschön. Wie geht's besser?
Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 10:15
von snafu
Naja, über `sorted()`...
Code: Alles auswählen
for (no, x) in sorted(enumerate(t), reverse=True):
print no, x
Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 10:15
von sma
Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 10:24
von snafu
sma hat geschrieben:
Stefan
Performance-mutella würde sich im Grab umdrehen.

Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 10:41
von sma
snafu hat geschrieben:Performance-mutella würde sich im Grab umdrehen
Ach, und du meinst, sorted braucht keinen wahfreien Zugriff und erzeugt keine Liste?
Dann probiere mal:
Code: Alles auswählen
def g():
a = 0
while a < 1e12:
yield a
a += 1
sorted(g(), reverse=True)
Stefan
Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 10:41
von snafu
Das ist mir dann gerade eben auch eingefallen.

Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 10:55
von jens
Da gibt's je was zu messen:
Code: Alles auswählen
import timeit
import string
t = list(string.ascii_letters)
def test1():
for no, x in enumerate(t):
foo = no, x
def test2():
for no in xrange(len(t)-1, -1, -1):
foo = no, t[no]
def test3():
for (no, x) in sorted(enumerate(t), reverse=True):
foo = no, x
def test4():
for (no, x) in reversed(list(enumerate(t))):
foo = no, x
for name, func in locals().copy().iteritems():
if not name.startswith("test"):
continue
print name
test = timeit.Timer(func)
print "%.2f" % test.timeit(number=100000)
print
Ausgabe:
test1
0.50
test2
0.53
test3
1.34
test4
0.98
(test1 ist nur zum Vergleich drin)
Die Ergebnisse hätte ich jetzt so nicht ganz erwartet...
Die sorted Variante sieht für mich noch am saubersten aus...
Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 11:05
von mutetella
snafu hat geschrieben:Performance-mutella würde sich im Grab umdrehen.

Nun ja, noch lebe ich...
jens hat geschrieben:Die Ergebnisse hätte ich jetzt so nicht ganz erwartet...
Geht mir auch manchmal so...
EDIT: Geht mir auch oft so...
EDIT 2: Geht mir eigentlich immer so...

Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 11:14
von BlackJack
@jens: Wieso sieht die `sorted()`-Variante am "saubersten" aus? Die drückt weniger deutlich aus was die Absicht ist als `reversed()` und ist auch was die Laufzeit angeht ein Risiko, denn welcher Sortieralgorithmus mit welchen Optimierungen sich tatsächlich dahinter verbirgt, ist ein Implementierungsdetail, während beim Algorithmus hinter `reversed()` nicht wirklich viele Variationsmöglichkeiten stecken können.
Wenn man auf Geschwindigkeit setzt, ist die `reverse()`-Methode auf Listen sicher auch einen Blick Wert, da dort bei CPython reiner C-Code auf der internen Darstellung der Liste operiert.
Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 18:25
von hendrikS
Alternative:
Code: Alles auswählen
s = "abcdef"
for i,c in zip(xrange(len(s)-1,-1,-1), s):
print i,c
Re: reversed(enumerate())
Verfasst: Donnerstag 14. Oktober 2010, 19:39
von BlackJack
@hendrikS: Da hast Du die Zeichenkette jetzt aber nicht umgedreht.
Re: reversed(enumerate())
Verfasst: Freitag 15. Oktober 2010, 08:38
von hendrikS
BlackJack hat geschrieben:@hendrikS: Da hast Du die Zeichenkette jetzt aber nicht umgedreht.
Oh, sorry. Habe ich übersehen. Wäre aber natürlich auch kein Hexenwerk.
Re: reversed(enumerate())
Verfasst: Freitag 15. Oktober 2010, 10:10
von mkesper
hendrikS hat geschrieben:Alternative:
Code: Alles auswählen
s = "abcdef"
for i,c in zip(xrange(len(s)-1,-1,-1), s):
print i,c
Neee, das liest sich doof.
