ordnen einer gemischten liste

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
ABTW

Hi
Ich habe das Problem, dass ich eine Liste nach dem Anfangsbuchstaben des ersten Wertes ordnen lassen möchte.
Diese Liste enthält mehrere Listen:
Hier das Beispiel
[ [ 'STRING','STRING', datetime.date(1950, 10, 10), 'STRING', datetime.date(2005, 8, 29), 'STRING', 'STRING', INT, INT, LONG, 'STRING'] , [...] ]

Wie ihr seht sind in einer großen Liste mehrere Listen mit unterschiedlichen Datentypen.
liste.sort() gibt leider einen fehler zurück, da es mit den Datumstypen nichts anfangen kann.
Wie kann ich meine Listen in der Liste trotzdem ordnen lassen? Wie gesagt, der Anfangsbuchstabe des ersten Strings soll entscheident sein.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also ich versteh nicht ganz wie die Datetimes sortiert werden sollen. Gehören die zu den Strings dazu? Wenn ja pack die doch mit den Strings in einen Tuple.

vielleicht hilft dir einfach mal:

Code: Alles auswählen

def suchen(item1,item2):
    return cmp(item1[0],item[2])

liste.sort(suchen)
Da kannste die suchen-Funktion nach belieben ändern. Muss einfach bei item1 > item2 1 bei gleichheit 0 und bei item2 < item1 -1 zurückgeben.

Gruss
Gast

hier zu verdeutlichung:

import datetime

a=[['Xaa', 'Bbb', datetime.date(1950, 10, 10), '9999', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz'], ['Scholze', 'Elfriede', datetime.date(1950, 10, 10), '0253595', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz']]

>>> a
[['Xaa', 'Bbb', datetime.date(1950, 10, 10), '9999', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz'], ['Scholze', 'Elfriede', datetime.date(1950, 10, 10), '0253595', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz']]

a.sort()

>>> a
[['Scholze', 'Elfriede', datetime.date(1950, 10, 10), '0253595', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz'], ['Xaa', 'Bbb', datetime.date(1950, 10, 10), '9999', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz']]



das klappt im terminal wunderbar. nur leider wenn ich es in ein skript einbaue klappt dies nicht mehr.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also bei mir funktioniert folgendes:

Code: Alles auswählen

import datetime

a=[['Xaa', 'Bbb', datetime.date(1950, 10, 10), '9999', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz'], ['Scholze', 'Elfriede', datetime.date(1950, 10, 10), '0253595', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz']]

a.sort()
print a
falls das nicht geht poste mal den ganzen Traceback.

oder versuche noch:

Code: Alles auswählen

a=[['Xaa', 'Bbb', datetime.date(1950, 10, 10), '9999', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz'], ['Scholze', 'Elfriede', datetime.date(1950, 10, 10), '0253595', datetime.date(2005, 8, 29), 'DV', '109841685344ef', 1, 0, 1L, 'pat_sturz']]

def sortieren(item1,item2):
    return cmp(item1[0],item2[0])
a.sort(sortieren)
print a
Gruss
BlackJack

Ich nehme mal stark an die Daten kommen aus 'ner Datenbank. Warum lässt Du nicht die Datenbank das Ergebnis schon sortieren?
Gast

danke @ rayo... funktioniert bestens

@ blackjack - an sich hast du recht, das wäre einfacher. nur leider würde es die dynamische zusammensetzung der befehle im quelltext erschweren da es sich immer unterschiedlich auf diverse tabellen bezieht. dafür gibt es bestimmt auch eine einfache lösung aber rayos lösung funktioniert jetzt schon :D
ABTW

achso noch eine Frage Rayo.
Könntest du mir noch erklären wieso und weshalb es funktioniert? Ich steige jetzt noch nicht ganz durch, auch wenn die Funktion eigentlich mini ist :roll:
was genau ist item1 und item2 und was macht cmp() mit ihnen?
cmp gibt doch eigentlich nur 1,0 oder -1 zurück oder nicht?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also sortieren wird einfach in der sort-funktion für jedes element aufgerufen. item1 und item2 sind die 2 array elemente die verglichen werden, und da sag ich einfach er soll einfach den ersten string vergleichen (cmp).

cmp gibt wirklich nur -1,0 und 1 zurück, aber mehr brauchts ja nicht,

Eigentlich ist die sortier Funktion nur die Entscheidunshilfe wie sortiert werden soll :)

Gruss
Antworten