14

zip() 関数を使用すると、奇妙な動作が見られます。z が zip オブジェクトである次の操作 len(list(z)) を実行すると、結果は 0 になり (これは私には間違っているようです)、アクションによって 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>
>>> 

ありがとう、アーメド。

4

2 に答える 2

16

Python 3では、zipはジェネレーターです。あなたがそうするとき、発電機は使い果たされていますlist(z)。ジェネレーターから返された値からリストを作成し、それを操作できます。

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
于 2013-01-31T23:45:32.570 に答える
3

cardinality前の回答を完了するために、イテラブルのサイズを取得するために呼び出される Python ライブラリがあります。

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

于 2016-10-31T16:35:08.403 に答える