Geht das auch kürzer?

Code-Stücke können hier veröffentlicht werden.
BugsBunny1113
User
Beiträge: 9
Registriert: Dienstag 22. November 2005, 22:18
Wohnort: Germany

Geht das auch kürzer?

Beitragvon BugsBunny1113 » Freitag 7. April 2006, 21:37

Schönen guten Abend,

Hatte folgendes Problem:

Die Datensätze einer mehrspaltigen ListCtrl werden ausgelesen. Daraus resultiert eine Liste von Tupeln. Diese soll nach Vorgabe sortiert werden (abwärts oder aufwärts!). Hab nun eine Funktion geschrieben, die unter Angabe der Spalte des Tupel die Liste dementsprechend sortiert. Ganz nützlich wie ich finde, jedoch recht lang.

Bin für jeden Verbesserungsvorschlag dankbar!

Code: Alles auswählen

ABSTEIGEND = 1
AUFSTEIGEND = 2

def quicksort(l, richtung):
    if l:
        if (richtung==ABSTEIGEND):
            left = [x for x in l if x > l[0]]
            right = [x for x in l if x < l[0]]
        else:
            left = [x for x in l if x < l[0]]
            right = [x for x in l if x > l[0]]           
        if len(left) > 1:
            left = quicksort(left, richtung)
        if len(right) > 1:
            right = quicksort(right, richtung)
        return left + [l[0]] * l.count(l[0]) + right
    return []

def do_quicksort(l,r):
    return (quicksort(l,r))

def sort_tupel_list(liste,sort_col_index, richtung):
#
#   Parameter:  liste = Liste aus Tupeln
#               sort_col_index = Spaltenindex der Wahlspalte
#               richtung = AUFSTEIGEND oder ABSTEIGEND
#
    temp_list = []
    index = 0
    for tupel in liste:       
        listtup = list(tupel)
        if (sort_col_index != 0):
            temp = listtup[0]
            listtup[0] = listtup[sort_col_index]
            listtup[sort_col_index] = temp
        temp_list.append((listtup,index))
        index += 1   
    temp_list = do_quicksort(temp_list,richtung)
    new_list = []
    for (x, index) in temp_list:
        new_list.append(liste[index])
    return(new_list)


#Spalte:  0        1       2
liste = [(1,"Meier",     1940),
         (3,"Smeelings" ,1976),
         (4,"Mueller"   ,1980),
         (5,"Breuers"   ,1974)]

print(liste)
liste = sort_tupel_list(liste,1,ABSTEIGEND) #oder ABSTEIGEND
print(liste)


MFG
Bugs
BlackJack

Beitragvon BlackJack » Freitag 7. April 2006, 22:09

Kurz genug?

Code: Alles auswählen

from operator import itemgetter

def sort_table(table, sort_column, reverse=False):
    return sorted(table, key=itemgetter(sort_column), reverse=reverse)

table = [(1,"Meier",     1940),
         (3,"Smeelings" ,1976),
         (4,"Mueller"   ,1980),
         (5,"Breuers"   ,1974)]


print(table)
table = sort_table(table, 1, True)
print(table)


Wenn Du nicht immer eine neue Liste erstellen willst, dann kannst Du auch die `sort()` Methode auf der Liste anstelle von `sorted()` benutzen um die Liste "in place" zu sortieren.
BugsBunny1113
User
Beiträge: 9
Registriert: Dienstag 22. November 2005, 22:18
Wohnort: Germany

Beitragvon BugsBunny1113 » Samstag 8. April 2006, 08:56

Absolut! Kürzer geht wohl kaum. Eche beeindruckend!

Besten Dank...

MFG
Bugs

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder