2013-01-08 19 views
10

Ich habe eine ListeSortieren einer Liste mit einer benutzerdefinierten Reihenfolge in Python

mylist = [['123', 'BOOL', '234'], ['345', 'INT', '456'], ['567', 'DINT', '678']]

ich es mit der Reihenfolge 1. DINT 2. INT 3. BOOL

Ergebnis sortieren möchten:

[['567', 'DINT', '678'], ['345', 'INT', '456'], ['123', 'BOOL', '234']]

ich habe in stackove ähnliche Fragen gesehen Flow, aber nichts ähnliches oder leicht für mich anwendbar. in der Liste für jedes Element durch Rücksendung eine ganze Zahl zu sortieren, anstatt die ganze Liste

+0

Sie haben einen Syntaxfehler: ‚345 ist nicht geschlossen. –

+0

"Ich möchte es in der Reihenfolge von 1 sortieren. DINT 2. INT 3. BOOL". Welche Ordnung ist das? Wenn ich ein weiteres Element '['317.3', 'FLOAT', '268.0']' hinzufüge, woher weiß ich, wo es in der sortierten Ausgabe hingehört? –

+0

@KarlKnechtel Nun, die vollständige Anwendung dieser ist, REAL (float), DINT, INT, SINT, BOOL zu sortieren. Dies ist die Reihenfolge, die ich möchte (groß bis klein). Diese Frage dient nur der Veranschaulichung. '123', '234', '345' ... alles hat keine wirkliche Bedeutung. – elwc

Antwort

26
SORT_ORDER = {"DINT": 0, "INT": 1, "BOOL": 2} 

mylist.sort(key=lambda val: SORT_ORDER[val[1]]) 

Alles, was wir hier tun, ist ein neues Element bereitstellt. Wir könnte Inline-ternäre Ausdrücke verwenden, aber das würde ein wenig unhandlich werden.

+0

Tut mir leid, ich werde die Frage bearbeiten – elwc

+0

Ich weiß nicht, was ich vermisse, aber ich bekomme ein paar Syntaxfehler – elwc

+0

@elwc - welche Art von Fehlern? –

0

Da dies nicht in einer phabetischen Reihenfolge ist glaube ich nicht, dass es eine einzige Funktion gibt, die es sortieren kann, aber was Sie tun könnten, ist eine neue Liste erstellen und dann anhängen. Das ist eine Art billige Methode, es zu tun; aber es macht den Job erledigt.

newlist=[]; 
for sub_list in mylist: 
    if(sub_list[1] == 'DINT']): 
      newlist.append(sub_list); 

for sub_list in mylist: 
    if(sub_list[1] == 'INT']): 
     newlist.append(sub_list); 

for sub_list in mylist: 
    if(sub_list[1] == 'BOOL']): 
      newlist.append(sub_list); 
+0

Hosenträger? 'von __future__ import braces' ;-) Siehe auch meine Antwort - du musst die Liste nur einmal durchlaufen :-) –

+0

Ja ich bevorzuge die andere Antwort. Zweiliner-Lösung. – elwc

+1

Auch wenn dieser Ansatz einen Sinn ergab, benutze Listencomprehensions, oder 'filter', oder etwas, um alles, was heilig ist, zu lieben. –

-1
 python 3.2 

    1. sorted(mylist,key=lambda x:x[1][1]) 

    2. sorted(mylist,reverse=True) 
Verwandte Themen