PYTHON: Listen innerhalb einer Liste nach einem bestimmten Feld sortieren

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von KRiusd, 23.12.2005.

  1. KRiusd

    KRiusd Jungspund

    Dabei seit:
    25.04.2005
    Beiträge:
    23
    Zustimmungen:
    0
    Hallo zusammen,

    folgendes Problem:

    Ich habe eine Liste in der viele Listen vorhanden sind:

    Code:
    a = [ ['Name', 'Vorname', 'Alter'], ['Name', 'Vorname', 'Alter'], ... ]
    Wenn ich die Liste nach dem ersten Element sortieren will ist das ja einfach:
    Code:
    a.sort()
    Wie stelle ich es jetzt an das ich nach Vorname oder Alter sortieren kann!


    Schon mal danke

    KRiusd
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 thorus, 30.12.2005
    Zuletzt bearbeitet: 09.01.2006
    thorus

    thorus GNU-Freiheitskämpfer

    Dabei seit:
    03.11.2002
    Beiträge:
    757
    Zustimmungen:
    0
    Ort:
    Passau, Niederbayern
    sort() kann man eine Vergleichsfunktion übergeben. In deinem Fall, könnte man so schreiben:
    Code:
    lcmp = lambda idx: lambda i, j: (i[idx] < j[idx]) and -1 or \
                (i[idx] > j[idx]) and 1 or 0
    
    a.sort(cmp=lcmp(1))    # Vorname
    a.sort(cmp=lcmp(2))    # Alter
    
     
  4. #3 KRiusd, 09.01.2006
    Zuletzt bearbeitet: 09.01.2006
    KRiusd

    KRiusd Jungspund

    Dabei seit:
    25.04.2005
    Beiträge:
    23
    Zustimmungen:
    0
    Vielen Dank!

    Das hilft mir schon mal ein wenig!

    Allerdings meldet sich Python mit:
    Code:
    TypeError: sort() takes no keyword arguments
    Habe gerade festgestellt, das Python 2.3.4 (mit dem ich arbeite) noch nicht mit cmp, key und reverse umgehen kann!

    Gibt es noch eine andere Möglichkeit sort() den lcmp Befehl schmackhaft zu machen?

    Thx
     
  5. #4 thorus, 09.01.2006
    Zuletzt bearbeitet: 09.01.2006
    thorus

    thorus GNU-Freiheitskämpfer

    Dabei seit:
    03.11.2002
    Beiträge:
    757
    Zustimmungen:
    0
    Ort:
    Passau, Niederbayern
    Ok, da ein Upgrade wohl bei dir nicht hilft (btw. ich liebe Decorators in 2.4, mein Weihnachtsbaum ist voller @s vor lauterm decorieren. :D), müssen wir mal in Python 2.3 gucken:
    Code:
    >>> print [].sort.__doc__
    L.sort(cmpfunc=None) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1
    Während in 2.4:
    Code:
    >>> print [].sort.__doc__
    L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
    cmp(x, y) -> -1, 0, 1
    Also einfach statt cmp cmpfunc angeben, oder einfach gar kein Keyword angeben weils ja sowieso das erste Argument jeweils ist.
    Sorry, war mein Fehler, das wusste ich nicht, dass es in 2.3 anders heißt.

    EDIT:
    Merke grade, dass die Funktion lcmp vielleicht etwas unübersichtlich ausschaut, man könnte sie natürlich auch so schreiben:
    Code:
    def lcmp(idx):
        def t(i, j): 
            if i[idx] < j[idx]:        # kleiner
                return -1
            elif i[idx] > j[idx]:      # größer
                return 1
            else:                      # gleich
                return 0
    
        return t
     
  6. KRiusd

    KRiusd Jungspund

    Dabei seit:
    25.04.2005
    Beiträge:
    23
    Zustimmungen:
    0
    Jetzt hats geklappt! :)

    Funktioniert einwandfrei!

    Viel Dank!
     
  7. #6 Onkel_Tom, 12.07.2006
    Onkel_Tom

    Onkel_Tom Grünschnabel

    Dabei seit:
    12.07.2006
    Beiträge:
    1
    Zustimmungen:
    0
    eine erweiterte Frage

    Hallo,
    ich habe ein Problem, das in die gleiche Richtung geht, aber noch nen Schritt komplexer ist.

    Ich habe auch eine Liste, in der wiederum Listen stehen

    Code:
    b = [ ['Art', 'Variante', 'Typ', float(Dauer)], ['Art', 'Variante', 'Typ', float(Dauer)], ...]
    Ich will nun diese Liste so sortieren, dass alle Einträge, bei denen Art und Variante und Typ gleich sind untereinander stehen und nach Dauer aufsteigend sortiert sind.

    Also in etwa so:
    Code:
    print b
    >>>>
    a var1 typ2 2
    b var2 typ1 3
    a var1 typ2 1
    b var2 typ2 1
    
    soll werden zu:
    Code:
    print b.sort()
    >>>>
    a var1 typ2 1
    a var1 typ2 2
    b var2 typ1 3
    b var2 typ2 1
    
    Vielen Dank für Hilfe.
    Onkel_Tom
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema: PYTHON: Listen innerhalb einer Liste nach einem bestimmten Feld sortieren
Besucher kamen mit folgenden Suchen
  1. python listen sortieren

    ,
  2. python 3.5 zusammen hang schreiben

    ,
  3. liste von listen nach dem ersten element sortieren python

    ,
  4. python strings untereinander anordnen,
  5. python liste nach datum sortieren
Die Seite wird geladen...

PYTHON: Listen innerhalb einer Liste nach einem bestimmten Feld sortieren - Ähnliche Themen

  1. [python] Einträge in Listen subtrahieren

    [python] Einträge in Listen subtrahieren: Hallo, ich will eine recht einfache Formel in Python umsetzen: delta T = t_(n+1) - t_(n) (Es soll die Differenz zwischen n+1-ten und n-ten Wert...
  2. Python-Interpreter PyPy 5.0 freigegeben

    Python-Interpreter PyPy 5.0 freigegeben: Der Python-Interpreter PyPy wurde in Version 5.0 veröffentlicht. Die aktuelle Version des Interpreters, der wesentlich schneller als der...
  3. Python-Interpreter PyPy 4.0 freigegeben

    Python-Interpreter PyPy 4.0 freigegeben: Der Python-Interpreter PyPy wurde in Version 4.0 veröffentlicht. Die aktuelle Version des Interpreters, der wesentlich schneller als der...
  4. Python 3.5 ist fertig

    Python 3.5 ist fertig: Über eineinhalb Jahre nach Python 3.4 haben die Entwickler jetzt die nächste Version veröffentlicht. In Python 3.5 gibt es zahlreiche Neuerungen...
  5. Python-Interpreter PyPy 2.6 freigegeben

    Python-Interpreter PyPy 2.6 freigegeben: Der Python-Interpreter PyPy wurde in Version 2.6 veröffentlicht. Der Schwerpunkt der aktuellen Version des Interpreters, der wesentlich schneller...