2017-10-30 8 views
-1

私はzipクラスの機能を学びたいと思っていました。私はこの非常に単純な例を書いた。Python zipオブジェクトは一度しか使用できません。何故ですか?

>>> names = ['name1','name2','name3'] 
>>> ages = ['age1','age2','age3'] 
>>> print(zip(names, ages)) 
<zip object at 0x03DB18F0> 
>>> zipped = zip(names, ages) 
for i in zipped: 
    type(i) 
    print(i) 

と出力されます(予想通り) -

<class 'tuple'> 
('name1', 'age1') 
<class 'tuple'> 
('name2', 'age2') 
<class 'tuple'> 
('name3', 'age3') 

私が書く場合はすぐにこの行の後:

for i in zipped: 
    print(i) 

それはコンパイルだけを印刷しません!

>>> zipped = zip(names, ages) 
>>> for i in zipped: 
    print(i) 
('name1', 'age1') 
('name2', 'age2') 
('name3', 'age3') 

正しく印刷この時間 - 私は再びこれをしなかった再確認するには

。解凍をしながらでも -

>>> names2, ages2 = zip(*zipped) 
Traceback (most recent call last): 
    File "<pyshell#29>", line 1, in <module> 
    names2, ages2 = zip(*zipped) 
ValueError: not enough values to unpack (expected 2, got 0) 

zipped変数が何らかの理由で空になったようですか?

注:必要に応じて、質問のタイトルを変更することができます。私はWindows(10)マシンでPython 3.6.1を使用しています。

答えて

5

zipは、イテレータ<zip object at 0x03DB18F0>)を生成します。これは1回だけ反復できます。一旦それを反復すると、それは疲れてしまいます。あなたはできるだけ頻繁にあなたが好きなように反復することができリスト生成したい場合は、次のことに注意するため

zipped = list(zip(names, ages)) 
+0

私の答え正解しました。どうもありがとうございます。それは私が持っていた唯一の推測でした:)それは発電機の仕組みのように聞こえます。それは同じ/同様の実装ですか? – Arjee

+1

@Arjeeジェネレータは、イテレータの作成を容易にするために導入された言語構造ですが、すべてのイテレータがジェネレータであるとは限らず、例えばジェネレータはコルーチンなどの他のものに使用されています。 –

+1

@Arjee [this](https://stackoverflow.com/questions/2776829/difference-between-pythons-generators-and-iterators)の質問を参照してください。 –

2

zipiteratorオブジェクトを返します。それらは2回以上反復することはできません。その後、が消耗してになります。

list(zip(names, ages))を使用して、イテレータのリストを作成できます。

listは、iteratorオブジェクトを使用してリストを作成します。これは複数回繰り返すことができます。

zip機能の詳細については、こちらをご覧ください。

+1

juanpa.arrivillaga @おかげで、私は優秀な – Vinny

関連する問題