Seite 1 von 1

sortieren einer liste...

Verfasst: Freitag 11. Mai 2007, 15:15
von jo_hb
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?

Verfasst: Freitag 11. Mai 2007, 15:27
von BlackJack
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)

Verfasst: Freitag 11. Mai 2007, 15:28
von birkenfeld
Entweder ein "lambda t: t.c" oder ein "operator.attrgetter('c')".

Re: sortieren einer liste...

Verfasst: Freitag 11. Mai 2007, 15:34
von mitsuhiko

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

Verfasst: Freitag 11. Mai 2007, 15:43
von jo_hb
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'?

Verfasst: Freitag 11. Mai 2007, 15:43
von BlackJack
Den Typtest würde ich weglassen.

Verfasst: Mittwoch 16. Mai 2007, 13:50
von jo_hb
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

Verfasst: Mittwoch 16. Mai 2007, 13:58
von birkenfeld
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.

Verfasst: Mittwoch 16. Mai 2007, 22:03
von jo_hb
oh, tja... danke! :oops: