Seite 1 von 1

Liste sortieren

Verfasst: Freitag 11. Mai 2012, 14:15
von recnice
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ß

Re: Liste sortieren

Verfasst: Freitag 11. Mai 2012, 14:19
von 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]])]

Re: Liste sortieren

Verfasst: Freitag 11. Mai 2012, 14:56
von recnice
Ja danke für die Hinweise,

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

Gruß