2014-02-11 8 views
11

Ich bin neu bei Python. Ich verwende Python 3.3.2 und ich habe eine harte Zeit, herauszufinden, warum der folgende Code:Die von der Kartenfunktion zurückgegebene Liste verschwindet nach einmaliger Verwendung.

strList = ['1','2','3'] 
intList = map(int,strList) 
largest = max(intList) 
smallest = min(intList) 

gibt mir diese Fehlermeldung:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: min() arg is an empty sequence 

jedoch diesen Code:

strList = ['1','2','3'] 
intList = list(map(int,strList)) 
largest = max(intList) 
smallest = min(intList) 

Gibt mir keine Fehler überhaupt.

Mein Gedanke ist, dass, wenn IntList dem Rückgabewert der Map-Funktion zugewiesen ist, es zu einem Iterator anstatt einer Liste wird, wie the docs. Und vielleicht als Nebeneffekt von max(), wurde der Iterator bis zum Ende der Liste iteriert, was Python glauben lässt, dass die Liste leer ist (Ich zeichne hier von C-Wissen, ich bin nicht vertraut mit der Funktionsweise von Iteratoren . in Python) der einzige Beweis, den ich dies zu unterstützen, ist, dass für den ersten Codeblock:

>>> type(intList) 
<class 'map'> 

während für den zweiten Block des Codes:

>>> type(intList) 
<class 'list'> 

Kann jemand bestätigen oder diese verweigern für mich bitte?

Antwort

12

Sie sind genau richtig. In Python 3 gibt map einen Iterator zurück, über den nur einmal iteriert werden kann. Wenn Sie ein zweites Mal über einen Iterator iterieren, wird sofort StopIteration ausgelöst, als ob es leer wäre. max verbraucht das Ganze und min sieht den Iterator als leer. Wenn Sie die Elemente mehrmals verwenden müssen, müssen Sie list aufrufen, um eine Liste anstelle eines Iterators zu erhalten.

+0

Sie können auch Tupel aufrufen oder auf Kartenobjekt setzen, wenn es Ihren Zwecken besser entspricht als Liste – fanny

5

aus Ihrer map Dokumentation:

Return an iterator that applies function to every item of iterable, yielding the results.

und von http://docs.python.org/3/library/stdtypes.html#typeiter

Once an iterator’s next() method raises StopIteration, it must continue to do so on subsequent calls.

So ein Iterator, und zwar unabhängig von dem Objekt zugrunde liegenden Daten können nur einmal verwendet werden. Es baut auf dem Konzept eines Generators auf.

itertools.tee kann verwendet werden, um mehrere unabhängige Iteratoren von einem zu machen.

l1,l2 = itertools.tee(intList,2) 
max(l1) 
min(l2) 
Verwandte Themen