2017-02-16 16 views
1

python 3のzipオブジェクトでソートされた関数を使用する理由を複数回は理解できません。 2回目に空リストを返します。pythonで繰り返し並べ替え3

In [34]: X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] 
    ...: Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1] 
    ...: yx = zip(Y, X) 
    ...: yx 
    ...: [(0, 'a'), (1, 'b'), (1, 'c'), (0, 'd'), (1, 'e'), (2, 'f'), (2, 'g'), 
    ...: (0, 'h'), (1, 'i')] 
    ...: yx_sorted=sorted(yx) 
    ...: 

In [35]: yx_sorted 
Out[35]: 
[(0, 'a'), 
(0, 'd'), 
(0, 'h'), 
(1, 'b'), 
(1, 'c'), 
(1, 'e'), 
(1, 'i'), 
(2, 'f'), 
(2, 'g')] 

In [36]: yx_sorted=sorted(yx) 

In [37]: yx_sorted 
Out[37]: [] 

In [38]: yx 
Out[38]: <zip at 0x10476aa88> 

yx私が見る限り、まだそこにあります。

答えて

1

CPython 3では、zipはクラスであり、呼び出し可能であることを意味します。これは、その用語が幅広く数学的な意味で機能していることを意味します。 Library ManualBuilt-in Functionsの章に記載されています。

呼び出されると、CPythonのzipは、zip objectを返します。これは、ドキュメントエントリが示す「イテレータを返します」というイテレータです。これは__iter__メソッドを持ち、self__next__メソッドを適切な振る舞いで返します。 zipオブジェクトは反復子なので、最初の完全な反復がsortedによって実行された後に使い果たされます。

doc entryでは、ほぼ同等のPythonコードはジェネレータ関数用であり、ジェネレータ関数を呼び出すとジェネレータ関数を返します。 (CPythonの組み込み関数はC言語でコード化されており、ジェネレータ関数はPythonでしかコード化できないため、CPythonはクラスとして実装します)。これは人々が間違ってzipがジェネレータを返すと言う理由です。しかし、同等のコードで生成されたジェネレータはイテレータとしてしか使用できないため、その結果は同じになり、「イテレータを返す」は依然として真です。実装(CPython以外)がPythonコード(PyPy?)を使用する場合、その実装ではzipがジェネレータになります。

EDIT:ドキュメントエントリへのリンクを追加し、以下:当該のXとY以来

zip(X, Y)はペアの同じ順序で新しい、新鮮な反復可能なを取得するために繰り返すことができ、reiterableです。 sorted(zip(X,Y))複数回作業します。

+0

@StefanPochmann合意し、完了しました。 –

+0

ありがとう!これを初心者に説明しましょう。 :D –

5

zipは、Python 3のジェネレータです。一度それを繰り返してしまえば、それは使い果たされます。

+0

私はジェネレータではないと思います。 –

+0

'zip'は関数ですが、Python 3ではジェネレータを_returns_します。Python 2ではリストを返します。 – Bendik

+0

@Bendik私はそれも機能だとは思わない。そして私はまだそれがジェネレータを返すとは思わない。それは型であり、イテレータを返します。私はそれが、できるだけ多くの/できるはずだと思います。 –

0

私は2.7.13

>>> X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] 
>>> Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1] 
>>> yx = zip(X, Y) 
>>> yx 
[('a', 0), ('b', 1), ('c', 1), ('d', 0), ('e', 1), ('f', 2), ('g', 2), ('h', 0), ('i', 1)] 
>>> yx_sorted = sorted(yx) 
>>> yx_sorted 
[('a', 0), ('b', 1), ('c', 1), ('d', 0), ('e', 1), ('f', 2), ('g', 2), ('h', 0), ('i', 1)] 
>>> yx 
[('a', 0), ('b', 1), ('c', 1), ('d', 0), ('e', 1), ('f', 2), ('g', 2), ('h', 0), ('i', 1)] 
>>> yx_sorted = sorted(yx) 
>>> yx_sorted 
[('a', 0), ('b', 1), ('c', 1), ('d', 0), ('e', 1), ('f', 2), ('g', 2), ('h', 0), ('i', 1)] 
>>> yx 
[('a', 0), ('b', 1), ('c', 1), ('d', 0), ('e', 1), ('f', 2), ('g', 2), ('h', 0), ('i', 1)] 
>>> 

を使用して、シェルでこれを複製することができないよあなたはJupyterノートブックを使用していますか?おそらくそれはPython自体ではなく、それと関係しているでしょうか?

+1

zipはpython 3でジェネレータを与え、python 2ではジェネレータを与えます。 – Bendik

+0

あなたはそうです。 Python3で印刷するとき、yxは私に 'zipオブジェクト'を与えます。 OPはどのようにしてジップ・リストを返すのですか? –

関連する問題