2013-01-31 9 views
8

Ich sehe ein seltsames Verhalten bei der Arbeit mit der zip() -Funktion. Wenn ich die folgende Operation ausführe len (list (z)) wo z ein Zip-Objekt ist, ist das Ergebnis 0 (was mir falsch scheint), und die Aktion scheint das Zip-Objekt zu löschen. Kann mir bitte jemand helfen zu verstehen, was vor sich geht.Das Ausführen von len in der Liste eines Zip-Objekts löscht die Postleitzahl

# python3 
Python 3.2.3 (default, Sep 30 2012, 16:41:36) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> w = [11, 22, 33, 44, 55, 66] 
>>> x = [1, 2, 3, 4] 
>>> y = ['a', 'b', 'c'] 
>>> z = zip(x, y, w) 
>>> z 
<zip object at 0x7f854f613cb0> 
>>> list(z) 
[(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)] 
>>> len(list(z)) 
0 
>>> list(z) 
[] 
>>> z 
<zip object at 0x7f854f613cb0> 
>>> 

Danke, Ahmed.

Antwort

11

In Python 3 zip is a generator. Der Generator ist erschöpft, wenn Sie list(z) tun. Sie können eine Liste aus den vom Generator zurückgegebenen Werten erstellen und daran arbeiten.

l = list(z) 
len(l) 
# -> 3 
l 
# -> [(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)] 

Generators sind eine gute Sache. Sie ermöglichen es uns, speichereffizienten Code fast so zu schreiben, wie wir Code schreiben würden, der sich mit Listen befasst. Um ein Beispiel aus dem verknüpften Wiki zu verwenden:

def double(L): 
    return [x*2 for x in L] 

Könnte als Generator neu geschrieben werden, um zu vermeiden, eine weitere Liste im Speicher zu erstellen:

def double(L): 
    for x in L: 
     yield x*2 
+2

Für alle, die nur auf Python 3, in Python 2.x zip verwendet wird, liefert eine Liste von Tupeln. – TimothyAWiseman

+2

Danke für das Hinzufügen. Auch 'zip()' von Python 3 funktioniert wie "itertools.izip()" von 2.x ' – bernie

+0

Natürlich könnte man einfach' double' schreiben als 'double = (x * 2 für x in L)' –

3

Um die vorherige Antwort abgeschlossen ist, gibt es eine Python-Bibliothek namens cardinality um die Größe von Iterablen zu erhalten.

http://cardinality.readthedocs.io/en/latest/

Verwandte Themen