2013-01-31 7 views
8

zip()関数を使用しているときに奇妙な動作が発生しています。次の操作を実行すると、len(list(z))はzがzipオブジェクトで、結果は0(私にとっては間違っているようです)で、そのアクションはzipオブジェクトをクリアしているようです。誰かが何が起こっているのか理解するのを助けてくれますか?zipオブジェクトのリストでlenを実行するとzipが消去されます

# 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> 
>>> 

、 アーメド、ありがとうございました。

答えて

11

Python 3でzip is a generatorlist(z)を実行すると、発電機が使い尽くされています。ジェネレータから返された値からリストを作成し、それを操作することができます。


Generators

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

は良いことです。それらは、リストを取り扱うコードを書くのとほぼ同じ方法で、メモリ効率の良いコードを書くことができます。リンクウィキからの例を使用するには:

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

は、メモリ内の別のリストを作成しないように発電機のように書き換えることができる。

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

タプルのリストを返します。 – TimothyAWiseman

+2

ありがとうございます。もちろん、Python 3の 'zip()'は2.xの 'itertools.izip()'のように動作します。 – bernie

+0

もちろん、 'double'を' double =(xの2のxはLの場合) ' –

3

前の回答を完了するために、cardinalityと呼ばれるPythonライブラリがありますiterablesのサイズを取得するために。唯一のPython 2.xのジップで、Pythonの3に使用されている人のため

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

関連する問題