Liste sortieren

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
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Hallo,

ich würde gerne folgende Liste sortieren steh aber voll auf dem Schlauch:
  • [['8', ['76', '0', '5', 5.0], ['669', '1', '5', 5.0990195135927845]], ['7', ['663', '1', '0', 1.0], ['670', '1', '4', 4.1231056256176606], ['671', '1', '3', 3.1622776601683795], ['672', '1', '2', 2.2360679774997898], ['673', '1', '1', 1.4142135623730951]], ['6', ['1', '0', '0', 0.0], ['75', '0', '4', 4.0], ['74', '0', '3', 3.0], ['73', '0', '2', 2.0], ['72', '0', '1', 1.0]]]
Und zwar nach folgenden Kriterium:
Für 8,6 und 7 sollen immer die nachfolgenden Listen geoordent werden, und zwars nach dem letzen Eintrag:
  • *'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'*
    8
    ['76', '0', '5', 5.0]
    ['669', '1', '5', 5.0990195135927845]
    *'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'*
    7
    ['663', '1', '0', 1.0]
    ['670', '1', '4', 4.1231056256176606]
    ['671', '1', '3', 3.1622776601683795]
    ['672', '1', '2', 2.2360679774997898]
    ['673', '1', '1', 1.4142135623730951]
    *'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'*
    6
    ['1', '0', '0', 0.0]
    ['75', '0', '4', 4.0]
    ['74', '0', '3', 3.0]
    ['73', '0', '2', 2.0]
    ['72', '0', '1', 1.0]
Das Ergebnis sollte wie folg aussehen:

  • *'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'*
    8
    ['76', '0', '5', 5.0]
    ['669', '1', '5', 5.0990195135927845]
    *'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'*
    7
    ['663', '1', '0', 1.0]
    ['673', '1', '1', 1.4142135623730951]
    ['672', '1', '2', 2.2360679774997898]
    ['671', '1', '3', 3.1622776601683795]
    ['670', '1', '4', 4.1231056256176606]

    *'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'**'*
    6
    ['1', '0', '0', 0.0]
    ['72', '0', '1', 1.0]
    ['73', '0', '2', 2.0]
    ['74', '0', '3', 3.0]
    ['75', '0', '4', 4.0]
Hat jemande eine Idee wie ich die Listen ordnen kann ?

Gruß
BlackJack

@recnice: Das geht mit der `sort()`-Methode auf Listen und dort mit dem `key`-Argument. Da musst Du eine Funktion angeben, die den Sortierschlüssel aus einem Element berechnet, also in diesem Fall einfach das letzte Element für eine Liste zurück gibt. Dafür kannst Du eine normale Funktion schreiben, eine ``lambda``-Funktion direkt als Argument übergeben, oder eine Funktion mit `operator.itemgetter()` erstellen.

Edit: Ich sehe gerade dass das Datenformat ungünstig ist. Man sollte nicht Werte mit unterschiedlichen Bedeutungen in ein und der selben Liste mischen. Das ist unübersichtlich und benötigt früher oder später Code der voll von Sonderbehandlungen und Spezialfällen ist. Deine inneren Listen enthalten eine Zeichenkette und mehrere Listen. Was dazu führt, dass man die Werte nicht mehr so einfach vergleichen und damit sortieren kann, weil die Zeichenkette am Anfang speziell berücksichtigt werden müssten. Die Elemente der äusseren Liste könnten zum Beispiel als Tupel aus zwei Elementen der Form (Zeichenkette, [Wertelisten…]) bestehen. Das sähe dann so aus:

Code: Alles auswählen

In [160]: old
Out[160]: 
[['8', ['76', '0', '5', 5.0], ['669', '1', '5', 5.0990195135927845]],
 ['7',
  ['663', '1', '0', 1.0],
  ['670', '1', '4', 4.1231056256176606],
  ['671', '1', '3', 3.1622776601683795],
  ['672', '1', '2', 2.2360679774997898],
  ['673', '1', '1', 1.4142135623730951]],
 ['6',
  ['1', '0', '0', 0.0],
  ['75', '0', '4', 4.0],
  ['74', '0', '3', 3.0],
  ['73', '0', '2', 2.0],
  ['72', '0', '1', 1.0]]]

In [161]: new
Out[161]: 
[('8', [['76', '0', '5', 5.0], ['669', '1', '5', 5.0990195135927845]]),
 ('7',
  [['663', '1', '0', 1.0],
   ['670', '1', '4', 4.1231056256176606],
   ['671', '1', '3', 3.1622776601683795],
   ['672', '1', '2', 2.2360679774997898],
   ['673', '1', '1', 1.4142135623730951]]),
 ('6',
  [['1', '0', '0', 0.0],
   ['75', '0', '4', 4.0],
   ['74', '0', '3', 3.0],
   ['73', '0', '2', 2.0],
   ['72', '0', '1', 1.0]])]
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Ja danke für die Hinweise,

ich arbeite die mal ein und hoffe dass es dann klappt!!

Gruß
Antworten