Seite 1 von 1

Geht das auch kürzer?

Verfasst: Freitag 7. April 2006, 21:37
von BugsBunny1113
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

Verfasst: Freitag 7. April 2006, 22:09
von BlackJack
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.

Verfasst: Samstag 8. April 2006, 08:56
von BugsBunny1113
Absolut! Kürzer geht wohl kaum. Eche beeindruckend!

Besten Dank...

MFG
Bugs