reversed(enumerate())

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, über `sorted()`...

Code: Alles auswählen

for (no, x) in sorted(enumerate(t), reverse=True):
    print no, x
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

reversed(list(enumerate(t)))
Stefan
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

sma hat geschrieben:

Code: Alles auswählen

reversed(list(enumerate(t)))
Stefan
Performance-mutella würde sich im Grab umdrehen. :twisted:
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Zuletzt geändert von sma am Freitag 15. Oktober 2010, 10:25, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das ist mir dann gerade eben auch eingefallen. :oops:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

snafu hat geschrieben:Performance-mutella würde sich im Grab umdrehen. :twisted:
Nun ja, noch lebe ich... :D
jens hat geschrieben:Die Ergebnisse hätte ich jetzt so nicht ganz erwartet...
Geht mir auch manchmal so... :mrgreen:


EDIT: Geht mir auch oft so... :)

EDIT 2: Geht mir eigentlich immer so... :?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
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.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Alternative:

Code: Alles auswählen

s = "abcdef"
for i,c in zip(xrange(len(s)-1,-1,-1), s):
    print i,c
BlackJack

@hendrikS: Da hast Du die Zeichenkette jetzt aber nicht umgedreht.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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. :(
Antworten