sortieren einer liste...

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
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Freitag 11. Mai 2007, 15:15

Hallo nochmal,
das Thema hört sich simpel an, aber ich kriegs nicht hin, jedenfalls nicht halbwegs vernünftig: Die folgende Liste soll also nach dem wert von c sortiert werden:

Code: Alles auswählen

import random

class test:
    def __init__(self, number):
        self.a = 'abc'
        self.b = 'xyz'
        self.c = number

my = []
for i in range(0,10):
    my.append(test(random.random()))

my_sorted = my.sort()

for i in my:
    print i.c
Ich nehme mal an dass ich da dem sort ein key= mitgeben muss, aber welche funktion liefert mir jetzt da c zurück?
BlackJack

Freitag 11. Mai 2007, 15:27

Entweder gibst Du als `key`-Funktion `operator.itemgetter('c')` mit, oder falls das Attribut die "natürliche" Ordnung der `test`-Objekte darstellt, implementierst Du `test.__cmp__()` entsprechend:

Code: Alles auswählen

    def __cmp__(self, other):
        return cmp(self.c, other.c)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 11. Mai 2007, 15:28

Entweder ein "lambda t: t.c" oder ein "operator.attrgetter('c')".
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Freitag 11. Mai 2007, 15:34

Code: Alles auswählen

import random

class Test:

    def __init__(self, number):
        self.a = 'abc'
        self.b = 'xyz'
        self.c = number

    def __cmp__(self, other):
        if isinstance(other, Test):
            return cmp(self.c, other.c)
        return NotImplemented

my = []
for i in range(0,10):
    my.append(test(random.random()))

my.sort()

for i in my:
    print i.c
TUFKAB – the user formerly known as blackbird
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Freitag 11. Mai 2007, 15:43

Hm, das mit dem operator.attrgetter('c') scheint mir doch am einfachsten zu sein: Hat das denn irgendwelche Nachteile gegenüber einer selbst geschriebenen cmp-funktion? Bzw. was bedeutet 'natürliche Ordnung'?
BlackJack

Freitag 11. Mai 2007, 15:43

Den Typtest würde ich weglassen.
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Mittwoch 16. Mai 2007, 13:50

Hm, vielleicht bin ich grad ein bisschen blind, aber warum funktioniert das folgende nicht:

Code: Alles auswählen

import random

class numbers:
    def __init__(self, number):
        self.num1 = 3.14
        self.num2 = number
        
class test:
    def __init__(self, number):
        self.a = 'abc'
        self.b = 'xyz'
        self.c = numbers(number)

my = []
for i in range(0,10):
    my.append(test(random.random()))

my = my.sort(key=lambda t: t.c.num2)

for i in my:
    print i.c.num2
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 16. Mai 2007, 13:58

Blind bist du nicht, aber du schaust dir deine Tracebacks nicht an...

Code: Alles auswählen

Traceback (most recent call last):
  File "x.py", line 20, in <module>
    for i in my:
TypeError: 'NoneType' object is not iterable
D.h. "my" ist None. Warum? Das kannst du in der Doku zu "sort()" nachlesen: sort() verändert die Liste "in-place" und gibt None zurück.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Mittwoch 16. Mai 2007, 22:03

oh, tja... danke! :oops:
Antworten