Seite 1 von 2

Verfasst: Donnerstag 12. März 2009, 20:21
von BlackJack
@Leonidas: Der Name `iterable` ist unpassend. Wenn es wirklich für beliebige `iterable` funktionieren soll (ungetestet):

Code: Alles auswählen

def minmax(iterable):
    values = iter(iterable):
    try:
        min_value, max_value = values.next()
    except StopIteration:
        raise ValueError('empty iterable')
    for value in values:
        min_value = min(min_value, value)
        max_value = max(max_value, value)
    return (min_value, max_value)

Verfasst: Donnerstag 12. März 2009, 21:49
von HWK
Blade Runner hat geschrieben:
HWK hat geschrieben:Dazu braucht man sorted nicht, es reicht liste.sort().
Das macht doch hier keinen Unterschied.

10111, das ist genau ice2k3s Lösung.
Das macht schon einen Unterschied. Warum soll man unnötigerweise eine neue Liste erzeugen, wenn ich bereits eine Liste besitze, die ich an Ort und Stelle sortieren kann?
MfG
HWK

Verfasst: Donnerstag 12. März 2009, 22:03
von BlackJack
Zum Beispiel weil die Leute von einer Funktion die Minimum und Maximum einer Liste bestimmt, vielleicht erwarten, das diese Funktion die Liste nicht einfach so umsortiert!? `min()` und `max()` machen das ja auch nicht.

Verfasst: Donnerstag 12. März 2009, 22:30
von HWK
Aber das vorgeschlagene

Code: Alles auswählen

liste = sorted(liste)
macht ja genau das. Und da ist doch

Code: Alles auswählen

liste.sort()
, was zum selben Ergebnis führt, offensichtlich weniger aufwendig, da es keine neue Liste erzeugt.
MfG
HWK

Verfasst: Donnerstag 12. März 2009, 22:34
von Blade Runner
HWK hat geschrieben:Aber das vorgeschlagene

Code: Alles auswählen

liste = sorted(liste)
macht ja genau das.
Ich war zu faul

Code: Alles auswählen

kopie = sorted(liste)
zu schreiben. ;)

Verfasst: Donnerstag 12. März 2009, 22:39
von str1442
macht ja genau das.
Nö. Du legst den Namen liste neu an mit der neuen Liste, die alte Liste ist dann einfach nicht mehr erreichbar. Zumindest wenn man von einer Funktion ausgeht und das nicht auf Modulebene geschieht.

Verfasst: Donnerstag 12. März 2009, 22:43
von Trundle
Ich denke mal, es ging BlackJack eher um das Szenario, wenn das in einer Funktion steht. Dann wird nämlich in dem einen Fall das empfangene Argument verändert, dh die Liste ist beim Aufrufer nach dem Aufruf verändert, was ganz sicher nicht das erwartete Verhalten ist, im anderen Fall nicht. Man müsste also erst eine Kopie der Liste erstellen. Wenn man das erst macht, gibt es aber auch keinen Grund, nicht `sorted()` zu verwenden.

Edit: Ich schreibe wohl offensichtlich zu langsam.

Verfasst: Freitag 13. März 2009, 18:15
von INFACT
cofi hat geschrieben:@INFACT Nur sollte man dabei keine built-ins überschreiben ;)

@baGX http://www.python-forum.de/topic-1689.html
Ansonsten kannst du dich auch vertrauensvoll an die offizielle Dokumentation wenden ( -> http://docs.python.org/)

Das ist zwar der eleganteste Weg die Aufgabe zu lösen, aber ich glaube aber ehrlich gesagt nicht, dass der Lehrer das im Sinn hatte.
Dabei werden keine builtins überschrieben:

Code: Alles auswählen

>>> def foo(list):
	print list

	
>>> foo("asdfgsdfg")
asdfgsdfg
>>> a=list()
>>> a
[]
>>> 

Verfasst: Freitag 13. März 2009, 18:39
von Blade Runner

Code: Alles auswählen

min = list[0]
max = list[0]
for item in list:
  if item > max:
    max = item
  if item < min:
    min = item 
min und max sind die builtins.

edit: richtigen Code eingefügt.

Verfasst: Freitag 13. März 2009, 18:41
von Leonidas
INFACT hat geschrieben:Dabei werden keine builtins überschrieben:
Doch, lokal in der Funktion. Auch das sollte man vermeiden, denn wenn die Funktion etwas länger ist kann es durchaus vorkommen dass man dort irgendwo ``list()`` aufrufen will und wenn dann ein komischer Fehler kommt ist das unpraktisch.

Verfasst: Freitag 13. März 2009, 20:51
von INFACT
Ok, überzeugt :roll:
:wink: