2016-12-29 21 views
2

pythonを学ぶと、zip関数を見つけ出し、2つのリストのペアを構築する必要があることを理解しています。しかし、それは私のIDEで動作していないようです。ここPythonのzip関数 - 奇妙な結果

a = ['a','b','c'] 
b = ['p','q','r'] 
r = zip(a,b) 
print(r) 

Iは、[( 'A'、 'P')、( 'B'、 'Q')、( 'C'、 'R')]の印刷を期待します。しかし、印刷出力は次のようになります。<zip object at 0x011E57D8>

どうして私は間違っていますか?

+1

'r = list(zip(a、b))'が必要です。 – Psidom

+1

「zip」が返すと書かれている文書は何ですか? "*タプルのイテレータを返す*" - イテレータであり、タプル自体ではありません。 'の典型的な用途はzip'また' '試みる – cdarke

答えて

7

Python 3を使用しています。Python 3では、zip()はリストではなくイテレータを返します。

反復子評価は遅延です。一度に1つの項目のみが返され、__len__はありません。イテレータはループのために最適に動作するように作られています。実際には、ほとんどの場合zip()がループ内で使用され、メモリとCPUサイクルを節約するために一度に1つのアイテムしか必要ありません。

イテレータの評価を強制的にリストに入れるには、list(zip(a,b))を実行してみてください。

+0

であります@ Psidom Python 3全体では、デフォルトではPython 2で評価されない遅延評価が行われます。 – Bryant

1

(パイソン2と比較して)のPython 3が怠惰であるので、あなたは、Python 3を使用している、zipリターンzipオブジェクトの代わりにzipの結果のような収集機能。 print(list(r))を使用して印刷してください。 Python 3 docsから

+0

辞書(ZIP(B))'と '[(a、b)は、低+に対する高い(低、高)でZIP]' for'ループ –

+1

@Psidom私はそれを編集するために編集しました。ありがとう! –

1

ジップ(*反復可能オブジェクト)

各iterableの要素をまとめるイテレータしてください。 Pythonで

は、オブジェクト(リスト、辞書、文字列など)を反復処理するために forループを使用しています。下位レベルでは、ためループは次のように実装されている:

>>> x = iter([1, 2, 3]) 
>>> x 
<listiterator object at 0x1004ca850> 
>>> x.next() 
1 
>>> x.next() 
2 
>>> x.next() 
3 
>>> x.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

ITERは、反復可能オブジェクトを受け取り、 イテレータを返す組み込み関数。 next()というメソッドを呼び出すたびに、イテレータは次の要素を返します。それ以上要素がなければ、StopIterationを発生させます。

出典http://anandology.com/python-practice-book/iterators.html

ジップ()がイテレータですし、任意のデータ構造(リスト、タプル、集合、辞書)にそれを有効にしてください。 zip()next())を呼び出すたびに、必要なペアを含むタプルが返されます。したがって、これらのタプルをリストに追加する必要があります。

list() functionがそうです。 iterable(あなたのケースでは、反復子関数zip())を受け取り、それをリストとして構築します。

a = ['a', 'b', 'c'] 
b = ['p', 'q', 'r'] 
r = list(zip(a, b)) 
print(r) 

>>> [('a', 'p'), ('b', 'q'), ('c', 'r')] 

これは同じです:r = [pair for pair in zip(a, b)] # This is a comprehension

しかし、最善のアプローチは、リスト()を使用することです:

a = ['a', 'b', 'c'] 
b = ['p', 'q', 'r'] 
r = [] 

for pair in zip(a, b): 
    r.append(pair) 

print(r) 

>>> [('a', 'p'), ('b', 'q'), ('c', 'r')] 

、あるいは短いです。これはPythonのイテレータで広く使用されています。

これはあなたに役立つと思います。