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!