2015-02-08 10 views
5

Total noob Frage hier, aber ich möchte wirklich die Antwort wissen.Python-Zip-Objekt verschwindet nach dem Durchlaufen?

Ich habe keine Ahnung, warum das Zip-Objekt einfach "verschwindet", nachdem ich versuche, es in seiner Listenform zu durchlaufen: eg.

>>> A=[1,2,3] 
>>> B=['A','B','C'] 
>>> Z=zip(A,B) 
>>> list(Z) 
>>> [('C', 3), ('B', 2), ('A', 1)] 
>>> {p:q for (p,q) in Z} 
{1: 'A', 2: 'B', 3: 'C'} 
>>> {p:q for (p,q) in list(Z)} 
{} 
>>> list(Z) 
[] 

(dies ist in Python 3.4.2)

Kann jemand helfen?

+1

'zip' in Python2 gibt eine Liste, während in Python3 ein Iterator. –

Antwort

3

Es gab eine Änderung des Verhaltens zwischen Python2 zu Python3:
in python2, zip gibt eine list of tuples während in python3 es an iterator zurückgibt.

Die Art des Iterators besteht darin, dass nach dem Iterieren der Daten - es zeigt auf eine leere Auflistung und das ist das Verhalten, das Sie erleben.

Python2:

Python 2.7.9 (default, Jan 29 2015, 06:28:58) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> A=[1,2,3] 
>>> B=['A','B','C'] 
>>> Z=zip(A,B) 
>>> Z 
[(1, 'A'), (2, 'B'), (3, 'C')] 
>>> list(Z) 
[(1, 'A'), (2, 'B'), (3, 'C')] 
>>> list(Z) 
[(1, 'A'), (2, 'B'), (3, 'C')] 
>>> list(Z) 
[(1, 'A'), (2, 'B'), (3, 'C')] 
>>> {p:q for (p,q) in Z} 
{1: 'A', 2: 'B', 3: 'C'} 
>>> Z 
[(1, 'A'), (2, 'B'), (3, 'C')] 
>>> Z 
[(1, 'A'), (2, 'B'), (3, 'C')] 

Python3:

Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 5 2014, 20:42:22) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> A=[1,2,3] 
>>> B=['A','B','C'] 
>>> Z=zip(A,B) 
>>> list(Z) 
[(1, 'A'), (2, 'B'), (3, 'C')] 
>>> list(Z) 
[] 
>>> 
+0

Ich möchte auch fragen, ob dieses "Erschöpfungsverhalten" einfach für eine bessere Speichereffizienz entwickelt wurde? –

+0

Ich glaube ja, ja: wie Simeon Visser in seiner Antwort vorgeschlagen hat, ist es ziemlich einfach, das gleiche Verhalten zu erreichen, indem man 'zip()' mit 'list()' umschließt. Aber wenn Sie nicht möchten, dass die gesamte Sequenz im Speicher ist, ist es effizienter, ein Element zu verwerfen, das wir bereits durchlaufen haben. – alfasin

3

zip erstellt ein Objekt zum wiederholten Iterieren der Ergebnisse. Das bedeutet auch, ist es nach einer Iteration erschöpft:

>>> a = [1,2,3] 
>>> b = [4,5,6] 
>>> z = zip(a,b) 
>>> list(z) 
[(1, 4), (2, 5), (3, 6)] 
>>> list(z) 
[] 

Sie müssen zip(a,b) rufen jedes Mal, wenn Sie es benutzen wollen oder die list(zip(a,b)) Ergebnis speichern und zu verwenden, die immer wieder statt.

Verwandte Themen